Django会在名为`id`的字段上强制使用主键,即使另一个字段已经被声明为主键

时间:2019-03-15 11:49:16

标签: python django

这些是我的要求,我无法更改它们:

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

我有几个问题:

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

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

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坚持要使用主键,即使另一个字段已经被声明为主键。

如何摆脱这种情况?

0 个答案:

没有答案