当前位置: 首页 > 面试题库 >

使用django-rest-framework序列化程序检索外键值

王辉
2023-03-14
问题内容

我正在使用django rest框架来创建API。我有以下型号:

class Category(models.Model):
    name = models.CharField(max_length=100)

    def __unicode__(self):
        return self.name


class Item(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(Category, related_name='items')

    def __unicode__(self):
        return self.name

为类别创建序列化器:

class CategorySerializer(serializers.ModelSerializer):
    items = serializers.RelatedField(many=True)

    class Meta:
        model = Category

…这将为我提供:

[{'items': [u'Item 1', u'Item 2', u'Item 3'], u'id': 1, 'name': u'Cat 1'},
 {'items': [u'Item 4', u'Item 5', u'Item 6'], u'id': 2, 'name': u'Cat 2'},
 {'items': [u'Item 7', u'Item 8', u'Item 9'], u'id': 3, 'name': u'Cat 3'}]

我将如何从Item序列化程序获得相反的结果,即:

[{u'id': 1, 'name': 'Item 1', 'category_name': u'Cat 1'},
{u'id': 2, 'name': 'Item 2', 'category_name': u'Cat 1'},
{u'id': 3, 'name': 'Item 3', 'category_name': u'Cat 1'},
{u'id': 4, 'name': 'Item 4', 'category_name': u'Cat 2'},
{u'id': 5, 'name': 'Item 5', 'category_name': u'Cat 2'},
{u'id': 6, 'name': 'Item 6', 'category_name': u'Cat 2'},
{u'id': 7, 'name': 'Item 7', 'category_name': u'Cat 3'},
{u'id': 8, 'name': 'Item 8', 'category_name': u'Cat 3'},
{u'id': 9, 'name': 'Item 9', 'category_name': u'Cat 3'}]

我已经阅读了有关其余框架的反向关系的文档,但这似乎与非反向字段的结果相同。我是否缺少明显的东西?


问题答案:

只需使用相关字段而不进行设置many=True

请注意,这也是因为你想要将输出命名为category_name,而实际字段是category,因此需要source在序列化程序字段上使用参数。

以下应该为你提供所需的输出…

class ItemSerializer(serializers.ModelSerializer):
    category_name = serializers.RelatedField(source='category', read_only=True)

    class Meta:
        model = Item
        fields = ('id', 'name', 'category_name')


 类似资料:
  • 我正在使用django rest框架创建一个API。我有以下几种型号: 要为类别ID创建序列化程序,请执行以下操作:

  • 本文向大家介绍django-rest-framework 加快序列化程序查询,包括了django-rest-framework 加快序列化程序查询的使用技巧和注意事项,需要的朋友参考一下 示例 假设我们有Travel很多相关领域的模型: 我们想/travels通过ViewViewSet构建CRUD 。 这是简单的视图集: 该ViewSet的问题在于我们的Travel模型中有许多相关字段,因此Dja

  • 问题内容: 情况 在Django REST Framework的验证中工作时,我注意到字段总是被验证,即使这样做不一定有意义。以以下示例进行模型的序列化: 我有一个创建用户的端点。因此,有一个领域和一个领域。如果两个字段不匹配,则无法创建用户。同样,如果所请求的已经存在,则无法创建用户。 用户为上述每个字段发布了不正确的值 已在序列化程序中实现的实现(请参见下文),以捕获不匹配和字段 实施: 问题

  • 我正在尝试让一个客户与电子邮件和电话有一对多的关系。 这是我的连载器 我无法指出为什么这篇文章不会继续,因为它一直说客户是必需的。 虽然我通过添加read_only=True使其工作,但即使我在ClientSerializer中定义了一个def create(self,validated_数据),我也无法在json数据中获得电子邮件和电话数组。 这就是我在views.py中调用序列化程序的方式 这

  • 问题内容: 我有一个具有可选字段的对象。我以这种方式定义了我的序列化器: 我认为 如果不存在,可以绕过该字段。但是,在文档中提到这会影响反序列化而不是序列化。 我收到以下错误: 当我尝试访问序列化实例时,这正在发生。(这是否意味着反序列化导致了这一问题?) 对于没有的实例会发生这种情况。如果我从序列化程序类中忽略它,则可以正常工作。 如何正确执行此操作?即,使用可选字段序列化对象。 问题答案: 序

  • 问题内容: 我已经尝试过类似的方法,但是它不起作用。 我需要一种能够从我的Serializer类访问request.user的方法。 问题答案: 你不能直接访问。你需要访问请求对象,然后获取用户属性。 像这样: 为了更安全,