相关疑难解决方法(0)

关于Django Rest Framework上嵌套序列化器的唯一验证

我有这样的情况,你有一个自定义嵌套序列化器关系与唯一字段.样例:

class GenreSerializer(serializers.ModelSerializer):

    class Meta:
        fields = ('name',) #This field is unique
        model = Genre

class BookSerializer(serializers.ModelSerializer):

    genre = GenreSerializer()

    class Meta:
        model = Book
        fields = ('name', 'genre')

    def create(self, validated_data):
        genre = validated_data.pop('genre')
        genre = Genre.objects.get(**genre)
        return Book.objects.create(genre=genre, **validated_data)
Run Code Online (Sandbox Code Playgroud)

问题:当我尝试保存json对象如{"name":"The Prince","genre":{"name":"History"}} DRF尝试验证流派对象的唯一约束以及"History" exists抛出一个例外,因为一个名为"History"的类型必须是唯一的,这是真的,但我只是试图关联对象而不是一起创建.

非常感谢!!

python django rest django-serializer django-rest-framework

11
推荐指数
1
解决办法
4303
查看次数

仅在创建新帖子时运行序列化程序的验证

我有2种视图-其中一种使用create,另一种使用RetrieveUpdateDestroyAPIView。两者都使用相同的Serializer类。我仅在创建新帖子时才需要标题验证,而在更新帖子时则不需要。
我使用“ PUT”请求更新某些帖子时出现标题验证错误。
我怎样才能解决这个问题?

class StoreApiView(mixins.CreateModelMixin, generics.ListAPIView):
    lookup_field = 'pk'
    serializer_class = ProductSerializer

    def get_queryset(self):
        qs = Product.objects.all()
        query = self.request.GET.get('q')
        if query is not None:
            qs = qs.filter(
                Q(title__icontains=query) |
                Q(description__icontains=query)
            ).distinct()
        return qs

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)


class StoreRucView(generics.RetrieveUpdateDestroyAPIView):
    lookup_field = 'pk'
    serializer_class = ProductSerializer
    permission_classes = [IsOwnerOrReadOnly]


    def get_queryset(self):
        return Product.objects.all()
Run Code Online (Sandbox Code Playgroud)

这是序列化器类的完整代码:

class ProductSerializer(ModelSerializer):
    product_ratings = ProductRatingSerializer(many=True,read_only=True)
    product_badges_set = ProductBadgesSerializer(many=True,read_only=True)

    author = serializers.SerializerMethodField()
    category …
Run Code Online (Sandbox Code Playgroud)

django django-rest-framework

5
推荐指数
1
解决办法
1071
查看次数