首页 > 解决方案 > 如何在 Django Rest 中使用 Post 请求更新其他表的字段

问题描述

我是 Django 新手,在发布或创建新条目时更新其他表的字段时遇到问题。我不知道该怎么做。我已经弄清楚了 2 天来如何通过序列化程序来做到这一点,或者如果不是通过序列化程序更好地实现它。

基本上,我想在每次创建交付时更新 Fruits 的状态。所以我可以说它是否可用。下面是代码片段。

这是我的模型:

class Delivery(models.Model):
    delivery_type = models.CharField(max_length=60)
    driver_name = models.CharField(max_length=60)

    def __str__(self):
        return self.delivery_type

class Fruits(models.Model):
    name = models.CharField(max_length=250)
    status = models.CharField(max_length=250)
    delivery = models.ManyToManyField(Delivery, related_name='fruits')

    def __str__(self):
        return self.name

这是我的序列化器:

class FruitSerializer(serializers.ModelSerializer):
    class Meta:
        model = Fruits
        fields = "__all__"

class DeliverySerializer(serializers.ModelSerializer):
    fruits = FruitSerializer(many=True)

    class Meta:
        model = Delivery
        fields = "__all__"

    def create(self, validated_data):
        delivery = Delivery.objects.create(
            delivery_type = validated_data['delivery_type'],
            driver_name = validated_data['driver_name']
            )
            
        #update the status field in Fruits Table
        fruits = validated_data.get('fruits')
        for fruit in fruits:
            fruit_data = Fruits(
                id = fruit['id'],
                status = "Not Available",
                delivery=delivery
            )
            fruit_data.save()
        return delivery

这是我的看法:

class DeliverySerializerView(APIView):
    def post(self, request):
        serializer = DeliverySerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

标签: pythondjangodjango-rest-framework

解决方案


您应该更新多对多关系,在您的情况下,您只需创建单独的 Delivery 和许多 Fruits 对象。

fruit_data.save()尝试后 delivery.fruits.add(fruit_data)有关 many_to_many 的更多信息,请参阅此帖子

如果你想更新相关水果的状态,你可以这样做 delivery.fruits.all().update(status="foo")


推荐阅读