Как бы я удалил объект из таблицы экземпляров из отношения «многие ко многим», не удаляя фактические данные объекта, когда я делаю PUT / PATCH - PullRequest
0 голосов
/ 21 февраля 2019

Ниже представлена ​​моя модель:

class Tag(models.Model):
    tag = models.CharField(max_length=100,unique=True)

class Image(models.Model):
    name=models.CharField(max_length=40,unique=False)
    tags = models.ManyToManyField(Tag)

Мой сериализатор:

class imagesSerializer(QueryFieldsMixin,serializers.ModelSerializer):
    tags = CreatableSlugRelatedField(
        many=True, 
        queryset=Tag.objects.all(),
        slug_field='tag',
        required= False
    )
   class Meta:
        model = Image
        fields = ('id','name','tags')
    def update(self, instance, validated_data):
        tags_data = validated_data.pop('tags')
        for item in validated_data:
           if Image._meta.get_field(item):
               setattr(instance, item, validated_data[item])
        Tag.objects.filter(image=instance).delete()
        for tag_data in tags_data:
            instance.tags.delete()
            tag_id, created=Tag.objects.get_or_create(tag=tag_data)
            instance.tags.add(tag_id)
        instance.save()
      return instance

Теперь после миграции создаются три таблицы: 1. Изображение 2. Тег 3. Image_Tags При обновленииданные тегов мои старые данные тегов удаляются в таблицах Tag и Image_Tags.Теперь я хочу удалить существующие данные тега для этого изображения из таблицы image_tags, но не в таблице тегов.

Как этого добиться с помощью Django?

1 Ответ

0 голосов
/ 21 февраля 2019

Вызов delete() в наборе запросов удаляет все объекты в наборе запросов, поэтому instance.tags.delete() и Tag.objects.filter(image=instance).delete() удаляют все теги (кстати, вы делаете одно и то же несколько раз).

Используйте clear(), чтобы удалить все отношения, или даже лучше, используйте set(), чтобы просто установить весь набор отношений за один раз (посмотрите внизу эта страница )

...