我无法在Django Rest Framework中显示反向关系。在我的情况下,租金可以有多个图像,我想在/ api / v1 / rent显示该租金的所有图像(客厅图像,厨房图像,浴室图像等),我的意思是租金资源。
那么,如何获取这些图库以显示在租赁资源中?
class Rental(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=300, blank=False, null=False)
phone_number = models.PositiveIntegerField(null=False, blank=False)
renter = models.CharField(choices=RENTER_CHOICES, max_length=1, default=RENTER_CHOICES[0])
def __str__(self):
return self.name
def user_directory_path(instance, filename):
return 'rent_{0}/{1}'.format(instance.rent.id, filename)
class Gallery(models.Model):
rent = models.ForeignKey(Rental, related_name="rent")
image = models.FileField(upload_to=user_directory_path)
tag = models.CharField(max_length=1, choices=TAGS, null=True, blank=True)
class GallerySerializer(serializers.ModelSerializer):
rent = serializers.ReadOnlyField()
class Meta:
model = Gallery
fields = ('rent', 'image', 'tag',)
class RentalSerializer(serializers.ModelSerializer):
user = serializers.ReadOnlyField(source='user.username')
# gallery = serializers.SerializerMethodField('get_children')
#
# def get_children(self, obj):
# print ('obj', obj.gallery_set)
# serializer = GallerySerializer(obj.gallery_set.all(), many=True)
# return serializer.data
gallery = GallerySerializer(source='gallery_set',many=True, read_only=True)
class Meta:
model = Rental
fields = ('user', 'name', 'phone_number','gallery',)
现在我没有获得图库列表,使用两种方式,一种评论方式和另一种来源=' gallery_set'方式。
更新
如果我rent = GallerySerializer(many=True)
我得到了画廊列表但是它有意义吗?
[
{
"user": "admin",
"name": "Sunrise Home",
"phone_number": 9842333833,
"rent": [
{
"image": "http://localhost:8000/media/rent_1/sittingRoom.jpg",
"tag": "L"
}
]
}
]
在上面的api中,您会看到显示的画廊,但名称将其显示为租赁资源内的租金列表。任何人都可以帮我设计一个api更好的方法吗?
答案 0 :(得分:1)
在Rental
模型中指定Gallery
的外键关系时,您指定的related_name
会自动在Rental
对象上定义字段。该字段的名称是您设置related_name
的所有内容,在本例中为rent
。
这里要理解的重要一点是related_name
将附加到关系的另一侧,从模型中声明键的位置。由于相关名称将是Rental
对象的属性,因此在您的示例中,更好的名称可能是galleries
。
假设您将模型中的related_name
从rental
更改为galleries
,您可以定义Rental
序列化程序以输出相关图库的列表:
class RentalSerializer(serializers.ModelSerializer):
user = serializers.ReadOnlyField(source='user.username')
galleries = GallerySerializer(many=True, read_only=True)
class Meta:
model = Rental
fields = ('user', 'name', 'phone_number','galleries')
通过声明与外键关系中定义的related_name
同名的GallerySerializer,它将自动查找与序列化租赁相关联的库。
在另一个例子中:
假设你在一个篮子里有几个鸡蛋。我们希望在Eggs和Basket之间建立多对一的关系,并通过在两者之间创建外键关系来实现这一点。这将是为每个Basket
存储相关Egg
的ID的形式。
在Django中,我们会在Egg
模型上声明该外键。这允许我们通过egg.basket
访问一个鸡蛋所在的篮子。我们还想确定特定篮子里的鸡蛋是什么。我们通过在外键字段上定义related_name
来做到这一点。这告诉Django应该调用将篮子连接到其所有包含的蛋的字段。由于此字段指的是一篮子中的所有鸡蛋,我们称之为eggs
。
在代码中:
class Basket(models.Model):
color = models.CharField()
class Egg(models.Model):
color = models.CharField()
basket = models.ForeignKey(Basket, related_name="eggs")