Django DRF将图像添加到数据库中已存在的ForeignKey
我希望将图像添加到列表(ForeignKey)中,该列表将已经存在于我的数据库中 我有一个形象模特Django DRF将图像添加到数据库中已存在的ForeignKey,django,django-rest-framework,django-rest-viewsets,Django,Django Rest Framework,Django Rest Viewsets,我希望将图像添加到列表(ForeignKey)中,该列表将已经存在于我的数据库中 我有一个形象模特 class Image(models.Model): photo = models.ImageField(blank=True, upload_to=get_image_filename) listing = models.ForeignKey(Listing, on_delete=models.CASCADE) 图像序列化器 class ImageSerializer(seri
class Image(models.Model):
photo = models.ImageField(blank=True, upload_to=get_image_filename)
listing = models.ForeignKey(Listing, on_delete=models.CASCADE)
图像序列化器
class ImageSerializer(serializers.HyperlinkedModelSerializer):
photo = serializers.ImageField(allow_empty_file=True)
class Meta:
model = Image
fields = ('url', 'photo', 'listing', )
def create(self, data):
listing, __ = Listing.objects.get_or_create(listing=data["listing"])
return Image(photo=data["photo"], listing=listing)
图像视图集
class ImageViewSet(viewsets.ModelViewSet):
queryset = Image.objects.all()
serializer_class = ImageSerializer
detail_serializer_class = ImageDetailSerializer
parser_classes = (FormParser, MultiPartParser)
'''Show detailed Image view'''
def get_serializer_class(self):
if self.action == 'retrieve':
if hasattr(self, 'detail_serializer_class'):
return self.detail_serializer_class
return super(ImageViewSet, self).get_serializer_class()
我已尝试在序列化程序中重写create方法,并在实际视图集中执行_create方法。但是不断地出错。任何方向正确的建议都会很棒]
位于/api/v1/images的字段错误/
无法将关键字“listing”解析为字段。选择包括:地址、空调、便利设施、大约平方英尺、地下室、城市、社区、描述、外部房屋、车库、暖气、hoa、房屋级别、id、图像、纬度、标价、经度、地块大小、数字房间、数字浴池、数字浴室、外屋、财产视图、发布日期、屋顶类型、房间总数、学校、,样式房子、税收、税收地图、类型房子、未完工的面积、用户、用户id、水、年建成、zipcode、分区
编辑
已将创建方法更改为
def create(self, validated_data):
listing_data = validated_data.pop('listing')
image = Image.objects.create(**validated_data)
image.listing =Listing.objects.get(photo=image,
listing_data=listing_data)
return image
现在错误
save()得到了一个意外的关键字参数“force_insert”请共享您的模型
Listing
列表模型有一大堆静态信息、卧室、浴室等。ImageModel是具有列表模型外键的模型。事实上,我相信你的问题在于在modelListing
上调用get\u或_create
,我编辑了这篇文章,现在遇到了一个新的错误。