2015-11-18 81 views
2

中的單個字段相關是的,我知道有很多關於DRF序列化關係的問題已經得到解答。但是,他們的非能幫助我或者我傾倒得到它...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) 
    ... 

現在我想在User這樣從Personbirthdate領域:

{ 
    "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'] 

它WOR但是必須有更好的方法。我有多個領域想以這種方式聯繫,結果會是尷尬的代碼,所以請幫助我!

+0

爲什麼'person_id'不是'ForeignKey(User)'? – dhke

+0

我已經試過了。但是我在序列化程序中該做什麼? – toXel

+1

'birthdate = DateTimeField(source =「person_set.birthdate」)'應該這樣做,其中'person_set'需要是外鍵的'related_name'。有關詳細信息,請參見[文檔](http://www.django-rest-framework.org/api-guide/fields/#source)。你可能也想使用'OneToOneField',因爲目前每個用戶可以有多個人。 – dhke

回答

1

再次感謝dhke。他在評論中幫助我找到了我的問題的答案。

我不得不做的是增加一個OneToOneFieldPerson的唯一的事:

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!)