【问题标题】:django rest nested serializer object setting nested object in post methoddjango rest嵌套序列化器对象在post方法中设置嵌套对象
【发布时间】:2021-03-09 14:05:06
【问题描述】:

大家好,希望你们身体健康:) 好的,我有一个图像模型和一个类别模型,它们有一个图像模型的外键,如下所示:

图像模型:

class Image(models.Model):
image = models.ImageField(upload_to="%Y/%m/%d")
alt = models.CharField(max_length=25)
name = models.CharField(max_length=25, unique=True)

def __str__(self):
    return self.name

类别型号:

class Category(models.Model):
image = models.ForeignKey(Image, on_delete=models.SET_NULL, null=True)
name = models.CharField(max_length=25, unique=True)
slug = models.SlugField(max_length=25, unique=True)

好的,现在我想当我调用一个类别时会像这样:

{
    "image":{
                "image":"https://example.com/media/image.png",
                "name":"image name",
                "alt":"image alternative"
            },
    "name":"category name",
    "slug":"category slug"
}

我编写了我的序列化程序和如下视图,并获得了一个像上面一样的上帝 json 对象 图像序列化器:

class ImageSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
image = serializers.ImageField()
alt = serializers.CharField(max_length=25)
name = serializers.CharField(max_length=25, validators=[UniqueValidator(queryset=Image.objects.all(), message="there is another image with same name.")])

类别序列化器:

class CategorySerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
image = ImageSerializer()
name = serializers.CharField(max_length=25,validators=[UniqueValidator(queryset=Category.objects.all()),])
slug = serializers.SlugField(max_length=25,validators=[UniqueValidator(queryset=Category.objects.all(),])

def validate_image(self, value):
    return get_object_or_404(Image, name=value['name'])
def create(self, validated_data):
    return Category.objects.create(**validated_data)
def update(self, instance, validated_data):
    instance.image = validated_data.get('image', instance.image)
    instance.name = validated_data.get("name", instance.name)
    instance.slug = validated_data.get("slug", instane.slug)
    instance.save()
    return instance

这是类别视图:

class CategoriesView(APIView, PaginationMixin):
pagination_class = PageNumberPagination()
permission_classes = (AllowAny,)
def get(self, request):
    cats = Category.objects.all()
    serializer = CategorySerializer(cats, many=True, context={"request":request})
    return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request):
    serializer = CategorySerializer(data=request.data, partial=True, context={"request":request})
    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)

现在的问题是当我在下面输入数据时我无法创建任何新类别:

{
    "image":{
                "name":"an existing image name"
            },
    "name":"new category name",
    "slug":"new category slug"
}

我得到这个错误:

    "image": {
    "name": [
        "there is another image with same name."
    ]
}

但它应该通过类别序列化器 image_validate 上的代码通过其名称获取现有图像,但它正在运行图像对象自我验证,但我没有尝试创建新图像对象我只想获取一个类别的图像,这个东西是在杀我!我想我搜索了它阻止我两天的每个地方:((请有人帮助我

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我解决了这个问题 :)) 在 django rest 嵌套对象中,我们不应该在序列化程序中使用唯一验证,而是我们应该在 view.py 中设置唯一验证 serializer.is_valid() 和 beore serializer.save() 并且所有代码都可以在views.py中这样处理:

    uniqueNameError = {"name":["there is another image with this name."]}
    def unique_name(name):
        for image in Image.objects.all():
            if name == image.name:
                return False
        return True
    
    class ImageView(APIView):
        def post(self, request):
            serializer = ImageSerializer(data=request.data)
            if serializer.is_valid():
                if not unique_name(request.data['name']):
                    return Response(uniqueNameError, status=status.HTTP_400_BAD_REQUEST)
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      相关资源
      最近更新 更多