簡體   English   中英

django rest 嵌套序列化程序 object 在 post 方法中設置嵌套 object

[英]django rest nested serializer object setting nested object in post method

大家好,我希望你健康:) 好的,我有一個圖像 model 和一個類別 model,它們有一個外鍵來圖像 model,如下所示:

圖片 model:

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

類別 model:

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 object:

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 上的代碼通過其名稱獲取現有圖像,但它的運行圖像 object 自我驗證但我沒有嘗試創建新圖像 object 我只是想獲得一個類別的圖像,這件事讓我很生氣活着:我想我搜索了它阻止我兩天的所有地方:((請有人幫助我

我解決了這個問題:)) 在 django rest 嵌套 object 中,我們不應該在序列化程序中使用唯一驗證,而是我們應該在 views.py 中設置唯一驗證,並且所有代碼都可以在serializer.is_valid() 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM