DRF涉及模型中的单个场

时间:2015-11-18 16:50:33

标签: python django api rest django-rest-framework

是的,我知道有很多关于DRF序列化器关系的问题已经得到解答。但是没有他们可以帮助我或我倾倒以获得它......

我有以下型号:

class User(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=30)
    ...

class Person(models.Model):
    id = models.IntegerField(primary_key=True)
    person_id = models.IntegerField()
    birthdate = models.DateTimeField(blank=True, null=True)
    ...

现在我希望birthdate Person中的User字段如下:

{
    "id": 397,
    "name": "name",
    "birthdate": "2015-11-11T00:00:00Z",
    ...
}

所以我这样做了:

class UserSerializer(serializers.ModelSerializer):
    birthdate = serializers.SerializerMethodField()

    class Meta:
        model = User

    def get_birthdate(self, obj):
        person = PersonSerializer(Person.objects.get(person_id=obj.pk)).data
        return person['birthdate']

它有效但是必须有更好的方法。我想以这种方式关联多个字段,结果将是笨拙的代码,所以请帮助我!

1 个答案:

答案 0 :(得分:1)

再次感谢dhke。他在评论中帮助我找到了我的问题的答案。

我唯一要做的就是向OneToOneField添加Person

class Person(models.Model):
    id = models.IntegerField(primary_key=True)
    person_id = models.OneToOneField(User, related_name='person')
    birthdate = models.DateTimeField(blank=True, null=True)
    ...

然后将以下字段添加到UserSerializer

birthdate = serializers.DateTimeField(source='person.birthdate')

这就是整个魔术。

(我喜欢DRF!)