Avr*_*ril 9 python django serialization django-rest-framework
我有一个与Django的User模型有一对一关系的Profile模型,我有另一个模型,称为Permission(与Django的内部权限概念无关),它具有Profile的外键.像这样:(为了简单起见,我在这里删除了大部分字段)
from django.db import models
from django.contrib.auth.models import User as DjangoUser
class Account(models.Model):
name = models.CharField(max_length=200, db_index=True)
class Profile(models.Model):
django_user = models.OneToOneField(DjangoUser)
default_account = models.ForeignKey(Account)
class Permission(models.Model):
# Which user has the permission
user = models.ForeignKey(Profile, db_index=True)
# Which account they have the permission on
account = models.ForeignKey(Account, db_index=True)
Run Code Online (Sandbox Code Playgroud)
我想为Permission创建一个序列化器,它将创建如下对象:
{
"user": "me@example.com",
"account": 123
}
Run Code Online (Sandbox Code Playgroud)
其中"account"的值是帐户的主键(这样很简单,我可以使用PrimaryKeyRelatedField),"user"的值是用户的电子邮件地址(这是我尚未想到的部分,因为电子邮件地址不直接存储在Profile对象上,它位于关联的DjangoUser对象上.另请注意,这不是只读的 - 在创建权限时,它需要能够从电子邮件地址反序列化为Profile对象.
到目前为止我尝试过的一些事情,用于在Permission序列化器上表示用户...
1.
user = serializers.RelatedField(read_only=False)
Run Code Online (Sandbox Code Playgroud)
有了这个,如果我将电子邮件地址(或主键或其他任何内容)作为"用户"发布,它会返回400错误,说{"user": "This field is required."}好像我根本没有包含该字段.
2.
user = serializers.SlugRelatedField(slug_field='django_user.email')
Run Code Online (Sandbox Code Playgroud)
有了这个,我明白了AttributeError: 'Profile' object has no attribute 'django_user.email'.如果我使用同样的事情'django_user__email'.
有任何想法吗?
小智 0
你能试一下吗:user = serializers.SlugRelatedField(slug_field='django_user__email')?有时在 Django 中,查询的双下划线表示法可能很有用。来源:https ://docs.djangoproject.com/en/1.8/topics/db/queries/#field-lookups