【问题标题】:Django Rest Framework - nested objects not being generated properlyDjango Rest Framework - 嵌套对象未正确生成
【发布时间】:2017-06-11 11:29:37
【问题描述】:

我正在尝试在 Django Rest Framework 中实现简单的 api。

我在 models.py 中有以下模型:

class Entry(BaseModel):
    company_name = models.CharField(max_length=256, null=True, blank=True)
    first_name = models.CharField(null=True, default=None, max_length=32)
    last_name = models.CharField(null=True, default=None, max_length=32)
    code = models.CharField(null=True, default=None, max_length=12)


    class Meta:
        db_table = 'entry'

    class Admin(admin.ModelAdmin):
        list_display = ('company_name', 'code')
        list_display_links = ('company_name', )
        ordering = ('-created',)


class EntryContactData(BaseModel):
    entry = models.ForeignKey(Entry, related_name='contact')
    email = models.CharField(max_length=256, null=True, blank=True)
    website = models.CharField(max_length=64, null=True, blank=True)
    phone = models.CharField(max_length=64, null=True, blank=True)

我的 API 序列化器.py:

from django.contrib.auth.models import User, Group
from rest_framework import serializers
from core.models import Entry, EntryContactData


class EntryContactSerializer(serializers.ModelSerializer):
    class Meta:
        model = EntryContactData
        fields = ('uuid', 'email', 'website', 'phone')


class EntrySerializer(serializers.ModelSerializer):
    contact = EntryContactSerializer(many=False, read_only=True)

    class Meta:
        model = Entry
        fields = ('uuid', 'company_name', 'first_name', 'last_name', 'contact')

还有我的 API 视图:

from core.models import Entry
from .serializers import EntrySerializer


class EntryViewSet(viewsets.ViewSet):
    """
    A simple ViewSet for listing or retrieving users.
    """
    queryset = Entry.objects.all()

    def retrieve(self, request, pk=None):
        queryset = Entry.objects.all()
        entry = get_object_or_404(queryset, code=pk)
        serializer = EntrySerializer(entry, context={'request': request})
        return Response(serializer.data)

当我想检索单个条目时,其 contact 字段为空:

{
    "uuid": "e6818508-a172-44e1-b927-3c087d2f9773",
    "company_name": "COMPANY NAME",
    "first_name": "FIRSTNAME",
    "last_name": "LASTTNAME",
    "contact": {}
}

所以它不包含EntryContactSerializer中定义的任何字段

我做错了什么?如何强制它返回序列化程序中包含的所有字段?谢谢各位。

【问题讨论】:

  • 您确定 Entry 包含 EntryContactData 的密钥吗?请出示数据表。

标签: python django rest django-rest-framework


【解决方案1】:

尝试在EntrySerializer中设置many=True,并为序列化器提供source属性,

class EntrySerializer(serializers.ModelSerializer): 
    contact = EntryContactSerializer(source='contact', many=True, read_only=True) 
    class Meta: 
        model = Entry 
        fields = ('uuid', 'company_name', 'first_name', 'last_name', 'contact')

【讨论】:

    猜你喜欢
    • 2017-04-09
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2018-07-07
    • 2021-11-30
    • 2014-07-07
    相关资源
    最近更新 更多