• 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']
  • 相关阅读:
    自动补全的java封装
    angular创建服务
    forEach和for包含异步调用的区别
    angular获取dom节点
    angular父组件给子组件传值
    angular环境
    SQL Server DBA 30问 【itpub】 天高地厚
    【转】任务管理器各参数说明 天高地厚
    开机引导 天高地厚
    测试发现数据库性能问题后的SQL调优 天高地厚
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7286654.html
Copyright © 2020-2023  润新知