Невозможно добавить к полю ManyToManyField в пользовательской задаче Django

У меня есть две модели в моем приложении Django (Tag и MyModel).

MyModel имеет ManyToManyField (теги), которые используют модель Tag

class Tag(models.Model):

    CATEGORY_CHOICES = (
        ('topic', 'topic')
    )

    tag = models.CharField(max_length=100, unique=True)
    category = models.CharField(max_length=100, choices=CATEGORY_CHOICES)


class MyModel(models.Model):

   id = models.CharField(max_length=30, primary_key=True)
   title = models.CharField(max_length=300, default='')
   author = models.CharField(max_length=300)
   copy = models.TextField(blank=True, default='')
   tags = models.ManyToManyField(Tag)

У меня есть пользовательская задача управления Django, в которой я удаляю таблицу Tags, получаю новые данные и обновляю таблицу Tags с помощью bulk_create

Tag.objects.all().delete()

....get new data for Tag table

Tag.objects.bulk_create(new_tags)

Однако после этого - если я попытаюсь добавить тег к экземпляру MyModel.tags...

...
mymodel_queryset = MyModel.objects.all()

for mymodel in mymodel_queryset
    mymodel.tags.add(5)

... Я получаю эту ошибку: CommandError: insert or update on table "bytes_mymodel_tags" violates foreign key constraint ..... ПОДРОБНАЯ ИНФОРМАЦИЯ: Ключ (tag_id)=(5) отсутствует в таблице "bytes_tag".

Похоже, что таблица Tag пуста, хотя я только что обновил ее

По какой-то причине удаление и сброс таблицы Tag не позволяет мне добавить в экземпляр MyModel.tags. Как я могу это сделать?

Примечание: Если я сначала не удаляю и не перезагружаю таблицу Tags, то я могу добавлять в MyModel.tags просто отлично

Вместо добавления случайного числа в mymodel.tags.add нужно добавить объект Tag.

mymodel_queryset = MyModel.objects.all()

for mymodel in mymodel_queryset
    mymodel.tags.add(new_tags)

Я немного расширю то, что уже было сказано здесь выше:

Когда у вас есть m2m отношения, если вы хотите создать новую строку в сквозной таблице с помощью add, вы должны сделать это, добавив экземпляр соответствующего класса, связанного через отношения.

Так, если у вас есть Tag и MyModel и вы хотите добавить Tag object к MyModel, вы должны сначала создать MyModel instance, а затем добавить к нему Tag instance.

Например:

tag_1 = Tag.objects.create(tag="test", category="test") 
my_model_1 = MyModel.objects.create(title="my Title", author="me", copy="xxx")

# This is how you do it
my_model_1.add(tag_1)

Et voilà!

Обратите внимание, что при использовании .add(instance) метод save() является встроенным, поэтому его не нужно вызывать.

Вернуться на верх