Django强制名为'id'的字段使用主键,即使另一个字段已声明为主键

2024-10-01 05:06:46 发布

您现在位置:Python中文网/ 问答频道 /正文

这些是我的要求,我不能改变:

  • 我有一个名为name的字段。这是我的主键
  • 我有一个名为id的字段,但它不是我的主键。你知道吗
  • id也是一个自动递增字段。你知道吗

我有几个问题:

  1. 自动递增字段必须是django中的主键
  2. Django在名为id的字段中设置primary_key

我已经能够解决第一个问题,通过使用:

from django.db.models.fields import AutoField
from django.db.models.fields import checks


class AutoFieldNonPrimary(AutoField):

    def _check_primary_key(self):
        if self.primary_key:
            return [
                checks.Error(
                    "AutoFieldNonPrimary must not set primary_key=True.",
                    obj=self,
                    id="fields.E100",
                )
            ]
        else:
            return []

现在我可以做:

class TheNiceUser(models.Model):
    id = AutoFieldNonPrimary()
    name = models.CharField(max_length=16, primary_key=True)

但是,id仍然声明为主键。现在,我的模型中有两个主键,迁移会引起抱怨。你知道吗

根据django doc,情况不应该是这样的:如果一个字段设置了primary_key,django不应该添加一个id字段作为主键。你知道吗

但是如果我声明一个id字段会发生什么呢?django似乎坚持要将其作为主键,即使另一个字段已经声明为主键。你知道吗

我怎样才能摆脱这种状况?你知道吗


Tags: djangokeynamefromimportselfid声明