【发布时间】: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