当前位置: 首页 > 知识库问答 >
问题:

使用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

要为类别ID创建序列化程序,请执行以下操作:

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'}]
[{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'}]

共有1个答案

岳志义
2023-03-14

只需使用相关字段,而不设置many=true

注意,还因为您希望输出名为category_name,但实际字段是category,所以您需要在serializer字段上使用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。我有以下型号: 为类别创建序列化器: …这将为我提供: 我将如何从Item序列化程序获得相反的结果,即: 我已经阅读了有关其余框架的反向关系的文档,但这似乎与非反向字段的结果相同。我是否缺少明显的东西? 问题答案: 只需使用相关字段而不进行设置。 请注意,这也是因为你想要将输出命名为,而实际字段是,因此需要source在序列化程序字段上

  • 问题内容: 我正在编写一个食谱管理器作为课程的示例项目。除了使用一些非常基本的功能之外,我对DRF并没有太多的经验。目的是: 创建具有相关成分的新配方。在创建配方对象的同时创建成分对象。 models.py: serializers.py 这样可以在数据库中成功创建配方对象和配料对象,但不会将配料列表与配方相关联。我认为这是因为运行时字典中的成分被删除了,所以当我使用创建新的配方时,没有相关的成分

  • 问题内容: 从文档中: read_only将此设置为True以确保序列化表示形式时使用该字段,而在反序列化期间更新实例时不使用该字段。 默认为False 必需通常,如果反序列化过程中未提供字段,则会引发错误。如果反序列化过程中不需要此字段,则设置为false。 默认为True。 因此,我有一个模型,该模型的字段不可为空,但我希望在pre_save方法中填充该字段,因此我已将该字段设置为序列化器,但

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

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

  • 问题内容: 我有一个逐步填写的模型,这意味着我正在制作一个表单向导。 因此,此模型中的大多数字段都是必需的,但必须避免在提交部分数据时引发非空错误。 我正在使用Angular.js和django-rest-framework,我需要告诉api应该是x和y字段,如果它们为空,则需要返回验证错误。 问题答案: 您需要专门覆盖该字段并添加自己的验证器。您可以在此处详细了解http://www.djang