简体   繁体   English

如何删除Django中具有ManyToMany关系的对应行?

[英]How to delete corresponding row with ManyToMany relationship in Django?

I am trying to make a basic pizza app with two API's, toppings and pizzas.我正在尝试使用两个 API,浇头和比萨饼制作一个基本的比萨饼应用程序。 When I delete a topping, I would like for the corresponding pizzas to also be deleted since the topping is no longer available.当我删除一个浇头时,我希望相应的比萨也被删除,因为该浇头不再可用。 As it currently stands, when I delete a topping it just keeps an empty pizza object.就目前而言,当我删除一个浇头时,它只会保留一个空披萨 object。

Models:楷模:

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)

Serializers:序列化器:

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 and Toppings.views are almost the same so I just included Pizza. 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

Please let me know if you need anything else.如果您需要其他任何东西,请告诉我。 Thank you.谢谢你。

ManyToMany by itself does not handle automatic deletion protocols since it does not have sense; ManyToMany 本身不处理自动删除协议,因为它没有意义; It's designed to permit related instances on both sides.它旨在允许双方的相关实例。 What you could do here are various approaches to accomplish what you want, what I'd suggest is to configure a pre_delete signal on your Toppings model that deletes all of its related Pizzas before being deleted.你可以在这里做的是各种方法来完成你想要的,我建议在你的Toppings model 上配置一个pre_delete信号,在被删除之前删除所有相关的Pizzas Also, I would recommend to decouple your M2M relationship and define it as a through model for a cleaner approach and more granular control over your M2M data structure (but this is just my personal opinion and style).另外,我建议将您的 M2M 关系解耦并将其定义为通过 model以更简洁地控制您的 M2M 数据结构(但这只是我个人的观点和风格)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM