Невозможно добавить к полю 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() является встроенным, поэтому его не нужно вызывать.