Как удалить соответствующий ряд из отношения ManyToMany в Django?
Я пытаюсь сделать базовое приложение для пиццы с двумя API, топпингами и пиццами. Когда я удаляю топпинг, я хотел бы, чтобы соответствующие пиццы также удалялись, поскольку топпинг больше не доступен. В настоящее время, когда я удаляю топпинг, он просто сохраняет пустой объект пиццы.
Модели:
class Toppings(models.Model):
name = models.CharField(max_length=60, unique=True)
def __str__(self):
return self.name
class Pizza(models.Model):
name = models.CharField(max_length=60, unique=True)
topping = models.ManyToManyField(Toppings, max_length=60, related_name="toppings")
def __str__(self):
return (self.name, self.topping)
Сериализаторы:
class PizzaSerializer(serializers.ModelSerializer):
toppings = ToppingsSerializer(read_only=True, many=True)
class Meta:
model = Pizza
fields = "__all__"
class ToppingsSerializer(serializers.ModelSerializer):
class Meta:
model = Toppings
fields = "__all__"
Pizza.views и Toppings.views почти одинаковы, поэтому я просто включил Pizza.
class PizzaList(generics.ListAPIView):
queryset = Pizza.objects.all()
serializer_class = PizzaSerializer
class PizzaCreate(generics.CreateAPIView):
queryset = Pizza.objects.all()
serializer_class = PizzaSerializer
class PizzaUpdate(generics.UpdateAPIView):
queryset = Pizza.objects.all()
serializer_class = PizzaSerializer
class PizzaDelete(generics.DestroyAPIView):
queryset = Pizza.objects.all()
serializer_class = PizzaSerializer
Пожалуйста, дайте мне знать, если вам нужно что-то еще. Спасибо.
ManyToMany сам по себе не обрабатывает протоколы автоматического удаления, поскольку не имеет смысла; он разработан для разрешения связанных экземпляров с обеих сторон. Здесь можно использовать различные подходы для достижения желаемого, я бы предложил настроить сигнал pre_delete на вашей модели Toppings
, который удаляет все связанные с ней Pizzas
перед удалением. Кроме того, я бы рекомендовал разделить ваши отношения M2M и определить их как сквозную модель для более чистого подхода и более детального контроля над структурой данных M2M (но это только мое личное мнение и стиль).