Это мои требования, и я не могу их изменить:
- У меня есть поле с именем
name
. Это мой первичный ключ
- У меня есть поле с именем
id
, но это не мой первичный ключ.
-
id
также является полем с автоинкрементом.
У меня есть несколько проблем:
- Поля автоинкремента должны быть первичными ключами в 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)
Но, тем не менее, идентификатор объявлен как первичный ключ. Теперь у меня есть два первичных ключа в моей модели, и миграции жалуются.
Согласно django doc , это не должно иметь место: если для поля установлено primary_key
, django не должен добавлять поле id
в качестве первичного ключа.
Но что произойдет, если я объявлю поле id
? Кажется, что django настаивает на том, чтобы сделать этот первичный ключ, даже если другое поле уже объявлено как первичный ключ.
Как мне выйти из этой ситуации?