将两个具有一对一关系的模型合并到一个模型序列化器中(Django)

4dc9hkyq  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(106)

在Django Rest中,我有一个名为User的模型,它被用作AUTH_USER_MODEL。为了扩展此模型并使用附加信息分离身份验证相关字段,我创建了另一个名为Profile的模型。Profile包含不相关的数据,如ageheightcountryzip_code等。这两个模型有一一对应的关系。我需要一个特殊的端点,只有管理员访问,并用于创建一个用户及其配置文件在一个请求中使用。为此,我需要一个像这样的扁平serailizer:

{
    "username": "something",
    "password": "1234",
    "email": "[email protected]",
    "age": 43,
    "country": "USA"
}

我尝试创建一个继承serailizers.Serializer的类并手动创建字段,但这似乎非常不工程化。还可以想象一下,如果稍后我向这些模型中添加新字段会发生什么。
另外,我可以在UserSerializer中包含ProfileSerializer,我会有:

{
    "username": "something",
    "password": "1234",
    "email": "[email protected]",
    "profile": {
                   "country": "USA",
                   // and rest of fields
                }
}

但这个例子不是我需要的。
我需要一个flat序列化器,它将两个(甚至更多)具有一对一关系的模型组合在一起。序列化器必须包含这两个模型的所有必需字段。我该怎么办?

zujrkrfu

zujrkrfu1#

您必须在序列化程序中为相关模型指定字段。
您的配置文件类可能如下(最标准的方式):

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    age = models.PositiveIntegerField()
    country = models.CharField(max_length=50)

    def __str__(self):
        return self.user.username

下面的序列化器给你一个扁平的json:

class UserSerializer(serializers.ModelSerializer):
    age = serializers.IntegerField(source="profile.age")
    country = serializers.CharField(source="profile.country")

    class Meta:
        model = User
        fields = [
            'id',
            'username',
            'email',
            'age',
            'country',
        ]

相关问题