嵌套的Django Rest Framework用户模型序列化器

时间:2019-01-07 11:00:36

标签: python django django-rest-framework

我的DRF序列化器遇到一些问题。本质上,我有一个将Django用户作为外键的模型,因此我可以看到谁附加到工作上。

当我尝试使用用户序列化程序解决这些嵌套在我的作业序列化程序中的用户ID时,我只会看到该ID,但是当我单独使用用户序列化程序时却看不到该ID,则返回正确的字段。以下是我的代码段。任何帮助都会很棒。

models.py

from profiles.models import UserProfile
class Job(models.Model):

    name = models.CharField(max_length=256, blank=False)
    designer_one = models.ForeignKey(UserProfile, related_name='designer_one', on_delete=models.DO_NOTHING)
    designer_two = models.ForeignKey(UserProfile, related_name='designer_two', on_delete=models.DO_NOTHING)

    def __str__(self):
        return self.name

    class Meta(object):
        verbose_name = "Job"
        verbose_name_plural = "Jobs"
        ordering = ['name']

serializers.py

from django.contrib.auth.models import User
class UsersSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'email', 'first_name', 'last_name')

class JobsSerializer(serializers.ModelSerializer):
    tasks = TasksSerializer(many=True, read_only=True)
    designer_one = UsersSerializer(many=False, read_only=True)
    designer_two = UsersSerializer(many=False, read_only=True)

    class Meta:
        model = Job
        fields = ('id', 'name', 'designer_one', 'designer_two', 'tasks')

从UsersSerializer API视图返回的内容

[
{
    "id": 1,
    "email": "test@example.co.uk",
    "first_name": "Admin",
    "last_name": "User"
},
{
    "id": 2,
    "email": "test1@example.co.uk",
    "first_name": "",
    "last_name": ""
}
]

我从JobsSerializer API视图返回的信息

{
    "id": 1,
    "name": "Test job",
    "designer_one": {
        "id": 1
    },
    "designer_two": {
        "id": 1
    },
    "tasks": [
        {
            "id": 1,
            "name": "Test Task",
            "job": 1
        }
    ]
}

1 个答案:

答案 0 :(得分:0)

问题是您正在为模型UsersSerializer使用User,而designer_onedesigner_two的类型为UserProfiile

您可以允许DRF使用depth选项(如@Anup Yadav建议的那样)为您生成嵌套的序列化器,但如果要控制显示的字段,则需要为{{1 }}并在Job序列化程序中使用