django序列化时使用外键的真实值

展示:

普通情况下序列化得到的外键的内容仅仅是id:
...
{
    fields: 
    {
        uat_date: "2015-07-25",
        statu: "CG",
        name: "慢赢优化",
        tester: [
                1
            ],
        product_manager: 1,
        module: [
                2,
                3
            ],
        project: 1,
        plan_version: 1,
        publish_date: "2015-07-25",
        actual_version: 1,
        type: "XQ",
        developer: [
            1
        ]
    },
    model: "amazingTable.content",
    pk: 1
}
...
序列化时得到外键的真实值:
...
{
    fields: 
    {
        uat_date: "2015-07-25",
        statu: "CG",
        name: "慢赢优化",
        tester: 
            [
                [
                    "kevin"
                ]
            ],
        product_manager: 
            [
                "kevin"
            ],
        module: 
            [
                [
                    "closewebbus",
                    "我是描写叙述"
                ],
                [
                    "xckhapp",
                    "我是描写叙述"
                ]
            ],
        project: 1,
        plan_version: 1,
        publish_date: "2015-07-25",
        actual_version: 1,
        type: "XQ",
        developer: [
            [
                "kevin"
            ]
        ]
    },
    model: "amazingTable.content",
    pk: 1
}
...

方法:

我序列化的是Content表。它含有一个外键关联的是Module表。1对多
我要先序列化Module表,然后序列化Content表的时候才干够使用到Module的真实值

class ModuleManager(models.Manager):
    def get_by_natural_key(self, name, description):
        return self.get(name = name, description = description)


class Module(models.Model):
    objects = ModuleManager()
    name = models.CharField(max_length=100, unique=True)
    description = models.CharField(max_length=100, blank=True, null=True)

    # natual_key的序列化
    def natural_key(self):
        return (self.name, self.description)

    # natual_keys的解序列化
    class Meta:
        unique_together = (('name', 'description'),)
序列化是否使用真实值:

jsons = serializers.serialize('json', queryset,use_natural_foreign_keys=False)
jsons = serializers.serialize('json', queryset,use_natural_foreign_keys=True)

附:

假设要给Content表序列化,那么要使用到外键的actual_key,要保证外键先序列化,例如以下依赖:

class Content(models.Model):
    name = models.CharField(max_length=100)
    ...
    module = models.ManyToManyField('Module')


    def natural_key(self):
        return (self.name,) + self.module.natural_key()
    # 和"def"同缩进
    natural_key.dependencies = ['example_app.module']
Django 中进行序列化,如果要限制外键字段的返回字段,可以使用 `depth` 或者 `SerializerMethodField` 两种方式。 1. 使用 `depth` 属性 在定义 Serializer ,可以通过设置 `depth` 属性来指定返回的外键字段的深度。例如,如果要限制返回 `Article` 模型中的 `author` 字段只返回 `id` 和 `username` 字段,则可以这样定义 Serializer: ```python class AuthorSerializer(serializers.ModelSerializer): class Meta: model = Author fields = ('id', 'username') class ArticleSerializer(serializers.ModelSerializer): author = AuthorSerializer(depth=1) class Meta: model = Article fields = ('id', 'title', 'content', 'author') ``` 这里将 `AuthorSerializer` 作为 `ArticleSerializer` 中 `author` 字段的序列化器,并设置 `depth=1`,表示只返回 `Author` 模型中的一层字段。 2. 使用 `SerializerMethodField` 字段 另一种方法是使用 `SerializerMethodField` 字段,自定义返回的外键字段。例如,如果要限制返回 `Article` 模型中的 `author` 字段只返回 `id` 和 `username` 字段,则可以这样定义 Serializer: ```python class ArticleSerializer(serializers.ModelSerializer): author = serializers.SerializerMethodField() class Meta: model = Article fields = ('id', 'title', 'content', 'author') def get_author(self, obj): return {'id': obj.author.id, 'username': obj.author.username} ``` 这里重写了 `author` 字段的序列化方法,返回一个字典,包含所需的字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值