![](/img/trans.png)
[英]Django Rest Framework receive primary key value in POST and return model object as nested serializer
[英]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.