2016-09-25 51 views
2

我正在爲我住的公寓提供一個簡單的數據庫,其中包含人員,單位,單位類型(家庭vs停車位)和單位持有人(聯合表格,一個人和一個單位之間的一對多關係) - 一個人可以在租用停車位時成爲單位類型的「家」的所有者。Django REST Framework序列化程序返回對象而不是數據

這是我的模型:

class Person(models.Model): 
    first_name = models.CharField(max_length=30, null=False) 
    last_name = models.CharField(max_length=30, null=False) 
    phone = models.CharField(max_length=20) 
    email = models.EmailField(max_length=20) 

class UnitType(models.Model): 
    description = models.CharField(max_length=30) 

class Unit(models.Model): 
    unit_number = models.IntegerField(null=False, unique=True) 
    unit_type = models.ForeignKey(UnitType, null=False) 
    unitholders = models.ManyToManyField(Person, through='UnitHolder') 

class UnitHolderType(models.Model): 
    description = models.CharField(max_length=30) 

class UnitHolder(models.Model): 
    person = models.ForeignKey(Person) 
    unit = models.ForeignKey(Unit) 
    unitholder_type = models.ForeignKey(UnitHolderType) 

這是我的看法:

class PersonViewSet(viewsets.ModelViewSet): 
    queryset = Person.objects.all() 
    serializer_class = PersonSerializer 

class UnitHolderTypeViewSet(viewsets.ModelViewSet): 
    queryset = UnitHolderType.objects.all() 
    serializer_class = UnitHolderTypeSerializer 

class UnitViewSet(viewsets.ModelViewSet): 
    queryset = Unit.objects.all() 
    serializer_class = UnitSerializer 

class UnitHolderViewSet(viewsets.ModelViewSet): 
    queryset = UnitHolder.objects.all() 
    serializer_class = UnitHolderSerializer 

class UnitTypeViewSet(viewsets.ModelViewSet): 
    queryset = UnitType.objects.all() 
    serializer_class = UnitTypeSerializer 

這是我的串行:

class UnitSerializer(serializers.ModelSerializer): 
    unit_type = serializers.SlugRelatedField(
     queryset=UnitType.objects.all(), slug_field='description' 
    ) 

    class Meta: 
     model = Unit 
     fields = ('unit_number', 'unit_type', 'unitholders') 

class UnitTypeSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = UnitType 

class PersonSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Person 

class UnitHolderSerializer(serializers.ModelSerializer): 
    person = serializers.PrimaryKeyRelatedField(many=False, read_only=True) 
    unit = serializers.PrimaryKeyRelatedField(many=False, read_only=True) 

    class Meta: 
     model = UnitHolder 
     fields = ('person', 'unit', 'unitholder_type') 

class UnitHolderTypeSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = UnitHolderType 

問題:

當我查詢/單位端點l IKE如下:

u = requests.get('http://localhost:8000/units').json() 

我的回答是這樣的:

[{'unit_type': 'Home', 'unit_number': 614, 'unitholders': [1]}] 

什麼,我想回去是這樣的:

[ 
    { 
     'unit_type': 'Home', 
     'unit_number': 614, 
     'unitholders': [ 
      { 
       'id: 1, 
       'first_name': 'myfirstname', 
       'last_name': 'mylastname', 
       'unitholder_type': 'renter' 
      } 
     ] 
    } 
] 

我敢肯定我的問題是在我UnitSerializer,但我是DRF品牌的新手,並閱讀了文檔,但似乎無法弄清楚。

回答

0

也許你必須做一些非常:

class UnitHolderViewSet(viewsets.ModelViewSet): 
    queryset = UnitHolder.objects.all() 
    unitholders = UnitHolderSerializer(read_only=True, many=True) 

Django rest framework serializing many to many field

+0

hmm。謝謝。我只是將這一點加入我的觀點,但沒有任何效果。查詢該端點仍然返回: [{'unit_type':'Home','unit_number':614,'單位持有人':[1]}] – Progger

3

一個簡單的解決辦法是使用depth選項:

class UnitSerializer(serializers.ModelSerializer): 
    unit_type = serializers.SlugRelatedField(
     queryset=UnitType.objects.all(), slug_field='description' 
    ) 

    class Meta: 
     model = Unit 
     fields = ('unit_number', 'unit_type', 'unitholders') 
     depth = 1 

這將連載所有嵌套關係1級深。如果你想擁有在每個嵌套場如何被序列化的精細控制,你可以明確地列出他們的串行:

class UnitSerializer(serializers.ModelSerializer): 
    unit_type = serializers.SlugRelatedField(
     queryset=UnitType.objects.all(), slug_field='description' 
    ) 
    unitholders = UnitHolderSerializer(many=True) 

    class Meta: 
     model = Unit 
     fields = ('unit_number', 'unit_type', 'unitholders') 

另外,作爲一個側面說明,你需要考慮修改內部意見prefetch related objects您查詢集,否則你會非常迅速地破壞應用程序的性能(使用類似django-debug-toolbar監視生成的查詢非常方便):

class UnitViewSet(viewsets.ModelViewSet): 
    queryset = Unit.objects.all().select_related('unit_type').prefetch_related('unitholders') 
    serializer_class = UnitSerializer 
+0

謝謝!這是非常有幫助的。深度= 1爲我工作,但通過錯誤顯式列出序列化程序。我會盡力自己解決:) – Progger

+0

我剛剛意識到「'unitholder_type':'renter'」沒有被返回。單位持有人類型正在關聯'單位'和'人'的聯合表中。我不僅要返回與該人關聯的單元,還要返回連接本身中保存的關聯類型。 – Progger

相關問題