简体   繁体   English

如何在 django 串行器中加入模型?

[英]How to join models in django serializers?

I'm trying to join two models, but I got the wrong result.我正在尝试加入两个模型,但我得到了错误的结果。 How to do it right?怎么做才对?

My models:我的模型:

class MoocherPage(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=False)
    name = models.CharField(max_length=48, unique=True, blank=False, null=False)
    bio = models.TextField(blank=False, null=False)


class MoocherResource(models.Model):
    url = models.URLField(blank=False, null=False)
    moocher = models.ForeignKey(MoocherPage, on_delete=models.CASCADE)

And serializers:和序列化器:

class MoocherResourceSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        URL_FIELD_NAME = 'url'
        model = MoocherResource
        fields = ('url', )


class MoocherPageSerializer(serializers.ModelSerializer):
    resources = MoocherResourceSerializer(many=True, read_only=True)

    class Meta:
        model = MoocherPage
        fields = ('name', 'bio', 'resources')
        depth = 1

I expected我期望

{
    "name": "KissofLove",
    "bio": "I'm the kiss of love and I collect money for all lovers of the world.",
    "resources": ["https://stackoverflow.com/users/KissofLove"]
}

But the resources was not included.但不包括resources


When I change read_only=True to False in the nested serializer an error appears.当我在嵌套序列化程序中将read_only=True更改为False时,会出现错误。 AttributeError: Original exception text was: 'MoocherPage' object has no attribute 'resources'.

Your models你的模型

class MoocherPage(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=False)
    name = models.CharField(max_length=48, unique=True, blank=False, null=False)
    bio = models.TextField(blank=False, null=False)


class MoocherResource(models.Model):
    url = models.URLField(blank=False, null=False)
    moocher = models.ForeignKey(MoocherPage, on_delete=models.CASCADE)

and your serializers,和你的序列化器,

from rest_framework.serializers import *

class ResourceListingField(RelatedField):
    def to_representation(self, value):
        return value.url


class MoocherPageSerializer(ModelSerializer):
    resources = ResourceListingField(many=True, source='moocherresource_set', read_only=True)

    class Meta:
        model = MoocherPage
        fields = ['name', 'bio', 'resources']

This returns the desired这将返回所需的

{
"name": "KissOfLove",
"bio": "I'm the kiss of love and I collect money for all lovers of the world.",
"resources": ["https://stackoverflow.com/users/KissofLove"]
}

response.回复。

Check out Custom relational fields查看自定义关系字段

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM