Поле обязательно для заполнения с внешним ключом Django rest Framework - PullRequest
0 голосов
/ 17 октября 2019

У меня проблема с тем, что мой 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)

и мой Serializer ингредиента похож на

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 Ответ

1 голос
/ 17 октября 2019

Похоже, вы не отправляете restaurant в своем запросе.

Даже если в своем сериализаторе вы определили, что ресторан не требуется.

restaurant = RestaurantSerializer(required=False)

Что делает егоневерный метод create. Там у вас есть

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

, который использует метод создания объектов (ваш аргумент ресторана здесь, вероятно, None), и, поскольку вы определили уникальный вместе с restaurant и name, это означает, что ни один из нихможет быть None.

...