gpt4 book ai didi

python - Django REST 框架 : SlugRelatedField for indirectly-related attribute?

转载 作者:太空狗 更新时间:2023-10-29 20:30:36 26 4
gpt4 key购买 nike

我有一个 Profile 模型,它与 Django 的 User 模型具有一对一的关系,我还有另一个模型,称为 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)

我想为 Permission 创建一个序列化程序,它将创建这样的对象:

{
"user": "me@example.com",
"account": 123
}

其中“account”的值是帐户的主键(所以这很简单,我可以使用 PrimaryKeyRelatedField),“user”的值是用户的电子邮件地址(这是我还没有弄清楚的部分,因为电子邮件地址没有直接存储在 Profile 对象中,而是在关联的 DjangoUser 对象中)。另请注意,这不是只读的 - 在创建权限时,它确实需要能够从电子邮件地址反序列化为 Profile 对象。

到目前为止我已经尝试过一些东西,用于在 Permission 序列化器上代表用户......

1.

user = serializers.RelatedField(read_only=False)

对于这个,如果我以“用户”身份发布电子邮件地址(或主键或其他任何内容),它会返回 400 错误,提示 {"user": "This field is required.",好像我根本没有包含该字段。

2.

user = serializers.SlugRelatedField(slug_field='django_user.email')

有了这个,我得到了 AttributeError: 'Profile' object has no attribute 'django_user.email'。如果我使用 'django_user__email',也会发生同样的事情。

有什么想法吗?

最佳答案

根据 Django REST Framework 序列化程序引用 (http://www.django-rest-framework.org/api-guide/fields/#core-arguments):

The name of the attribute that will be used to populate the field. May be a method that only takes a self argument, such as URLField(source='get_absolute_url'), or may use dotted notation to traverse attributes, such as EmailField(source='user.email').

因此,如果 source='user.email' 不起作用,您可以尝试创建一个方法(例如 get_user_email),在 source 中使用它 字段并让它手动返回用户电子邮件。

关于python - Django REST 框架 : SlugRelatedField for indirectly-related attribute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26167406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com