序列化Django模型并包含ForeignKeyField + OneToOneField的更多信息

时间:2015-02-18 18:30:20

标签: python django

使用Django 1.7。

我有一个我要序列化的模型类TopicTopic的属性Creator是类UserProfile的ForeignKey。序列化的输出给出了以下字符串:

'{"fields": {"building": 1, "title": "Foobar", "created": "2015-02-13T16:14:47Z", "creator": 1}, "model": "bb.topic", "pk": 2}'

我想要key"创作者"说出与UserProfile相关联的用户名(与现在相反,它提供与UserProfile相关联的pk值。用户名保存在具有django.contrib.auth.models class {的OneToOneField中{1}}。

我尝试实现UserProfileManager,但要么我做错了,要么以下不是合适的策略:

User

最后,我环顾四周,找到了指向这个的指针:https://code.google.com/p/wadofstuff/wiki/DjangoFullSerializers但它说最后一次更新是在2011年,所以我假设还有其他的东西。

感谢。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

看起来您还没有实现使用自然键序列化UserProfile所需的所有代码。

实际上,在反序列化对象时会调用get_by_natural_key方法。如果您希望使用自然键而不是pk对其进行序列化,则应向模型提供natural_key方法。

类似的东西:

class UserProfileManager(models.Manager):
    def get_by_natural_key(self, user, company):
        return self.get(user__user__username=user, company=company)

class UserProfile(models.Model):
    objects = UserProfileManager()

    user = models.OneToOneField(User)
    company = models.CharField(max_length=255)

    def natural_key(self):
        return (self.user.name, self.company)

现在,如果您序列化Topic实例:

import django.core.serializers

obj = serializers.serialize('json', Topic.objects.all(), indent=2, use_natural_foreign_keys=True, use_natural_primary_keys=True)

你应该得到类似于:

的输出
{
  "fields": {
    "building": 1,
    "title": "Foobar",
    "created": "2015-02-13T16:14:47Z",
    "creator": [
      "dummy",
      "ACME Inc."
    ]
  }, 
  "model": "bb.topic", "pk": 2
}

假设虚拟用户在其用户个人资料中存在名为 ACME Inc。的公司。

希望这有帮助。