外键错误Django rest Framework上的必填字段

时间:2019-10-17 06:41:05

标签: django api django-rest-framework

我遇到一个问题,我的api正在创建重复数据,因为我只是传递成分名称及其餐厅而不是Pk等。因此,为了防止出现这种情况,我制作了

class Meta:
     unique_together = ('restaurant' ,'name')

约束我的模型。在此之前,一切都很好,只是创建了重复的条目。现在,添加此约束后,它说“必填餐厅字段”,并且我的序列化程序无效。

我的成分模型是这样的

class Ingredient(models.Model):
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE )
    name = models.CharField(max_length=255 ,)

    class Meta:
        unique_together = ('restaurant' ,'name')

    def __str__(self):
        return str(self.name)

,而我的成分序列化器就像

class IngredientsSerializer(serializers.ModelSerializer):
    restaurant = RestaurantSerializer(required=False)
    class Meta:
        model = Ingredient
        fields = '__all__'

    def create(self, validated_data):
        restaurant = validated_data.get('restaurant')
        name = validated_data.get('name', None)
        ingredient = Ingredient.objects.create(restaurant=restaurant, name=name)
        return ingredient

我的用于序列化的view.py就像

@permission_classes([AllowAny])
class CreateIngredients(APIView):
    def post(self, request):
        serializer = IngredientsSerializer(data=request.data)

        if serializer.is_valid():
            restaurant=Restaurant.objects.get(id=request.POST['restaurant'])
            obj_article = serializer.save(restaurant=restaurant)
        return Response(success_response(data='none', msg='Ingredient added'), status=status.HTTP_200_OK)

1 个答案:

答案 0 :(得分:1)

好像您没有在请求中发送restaurant

即使在序列化程序中,您已定义不需要餐厅。

restaurant = RestaurantSerializer(required=False)

使之无效的是create方法。在那里

ingredient = Ingredient.objects.create(restaurant=restaurant, name=name)

使用对象创建方法(您的餐厅参数可能是None),并且由于您已将restaurantname定义为唯一,因此这两个对象都不可以是{{ 1}}。