我遇到一个问题,我的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)
答案 0 :(得分:1)
好像您没有在请求中发送restaurant
。
即使在序列化程序中,您已定义不需要餐厅。
restaurant = RestaurantSerializer(required=False)
使之无效的是create
方法。在那里
ingredient = Ingredient.objects.create(restaurant=restaurant, name=name)
使用对象创建方法(您的餐厅参数可能是None
),并且由于您已将restaurant
和name
定义为唯一,因此这两个对象都不可以是{{ 1}}。