2016-09-25 86 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

相关问题