在父类中显示外键

时间:2017-03-26 15:42:25

标签: python django django-rest-framework

我无法在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更好的方法吗?

1 个答案:

答案 0 :(得分:1)

Rental模型中指定Gallery的外键关系时,您指定的related_name会自动在Rental对象上定义字段。该字段的名称是您设置related_name的所有内容,在本例中为rent

这里要理解的重要一点是related_name将附加到关系的另一侧,从模型中声明键的位置。由于相关名称将是Rental对象的属性,因此在您的示例中,更好的名称可能是galleries

假设您将模型中的related_namerental更改为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")