使用Django 1.7。
我有一个我要序列化的模型类Topic
。 Topic
的属性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年,所以我假设还有其他的东西。
感谢。非常感谢任何帮助。
答案 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。的公司。
希望这有帮助。