Я хочу автоматически вводить поле "id" для (django) таблиц "многие ко многим" - PullRequest
0 голосов
/ 05 марта 2019

Я испытал «ValueError» при попытке добавить экземпляры модели с отношением «многие ко многим».ValueError: «(Idea: hey)» должно иметь значение для поля «id», прежде чем можно будет использовать это отношение «многие ко многим».Здесь было дано много ответов, но ни один не помог.Моим решением было «вручную» ввести значения «id».

>>> import django
>>> django.setup()
>>> from myapp1.models import Category, Idea
>>> id2=Idea.objects.create(
...     title_en='tre',
...     subtitle_en='ca',
...     description_en='mata',
...     id=5,
...     is_original=True,
... )
>>> id2.save()
>>> cat22=Category(title_en='yo')
>>> cat22.save()
>>> id2.categories.add(cat22)
>>> Idea.objects.all()
<QuerySet [<Idea: tre>]>
>>> exit()

Обратите внимание, что я вручную добавил «id». Как мне дать команду django для автоматического добавления поля "id"? Примечание: я пытался добавить "autoField", но не смог, спасибо

@python_2_unicode_compatible
class Idea(UrlMixin, CreationModificationDateMixin, MetaTagsMixin):
    id = models.IntegerField(primary_key=True,)
    title = MultilingualCharField(_("Title"), max_length=200,)
    subtitle = MultilingualCharField(_("Subtitle"), max_length=200, blank=True,)
    description = MultilingualTextField(_("Description"), blank=True,)
    is_original = models.BooleanField(_("Original"), default=False,)
    categories = models.ManyToManyField(Category,

1 Ответ

0 голосов
/ 05 марта 2019

Вы путаете две вещи здесь:

  • При связях «многие ко многим» при соединении двух объектов оба объекта уже должны быть сохранены в базе данных (иметь первичный ключ), поскольку под капотами Django создает третий объект, который указывает на два объекта. объекты для их соединения. Это возможно только в том случае, если оба имеют id, предполагая, что id является первичным ключом.

  • При создании объекта вам не нужно явно устанавливать id (на самом деле вы не должны). По умолчанию django Model будет иметь id, установленный в качестве автоматического поля и в качестве первичного ключа (вы можете переопределить это, указав свой собственный pk, но в общем случае в этом нет необходимости). id создается автоматически при первом сохранении модели.

Вы увидели ошибку, потому что, вероятно, один из объектов (идея или категория) не был сохранен в базе данных до того, как вы подключили их. В вашем примере кода вам не нужно передавать id=5, он будет работать без него, потому что вы сохраняете id2 и category перед их соединением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...