检索与Django的REST的架构串行外键值检索与Django的REST的架构串行外键值(Retri

2019-05-13 01:46发布

我使用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'}]

我怎么会去从项目串行,即得到相反的:

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

我通过对文档阅读反向关系,对于剩下的框架,但它似乎是相同的结果,非反转领域。 我失去了一些东西明显?

Answer 1:

只需使用相关领域没有设置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')


Answer 2:

在目前的DRF(3.6.3)版本,这为我工作

class ItemSerializer(serializers.ModelSerializer):
    category_name = serializers.CharField(source='category.name')

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


Answer 3:

你可以做的另一件事是:

  • 创建您的属性Item模型,返回的类别名称及
  • 公开为ReadOnlyField

您的模型是这样的。

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

    def __unicode__(self):
        return self.name

    @property
    def category_name(self):
        return self.category.name

你的串行器应该是这样。 需要注意的是串行器将自动获得价值category_name通过使用相同的名称命名领域模型属性。

class ItemSerializer(serializers.ModelSerializer):
    category_name = serializers.ReadOnlyField()

    class Meta:
        model = Item


Answer 4:

这个工作对我罚款:

class ItemSerializer(serializers.ModelSerializer):
    category_name = serializers.ReadOnlyField(source='category.name')
    class Meta:
        model = Item
        fields = "__all__"


Answer 5:

他的工作是2018年8月8日和DRF版本3.8.2:

class ItemSerializer(serializers.ModelSerializer):
    category_name = serializers.ReadOnlyField(source='category.name')

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

使用元read_only_fields我们可以准确地宣布哪些领域应该是READ_ONLY。 然后,我们需要声明的元的“洋”场fields (最好是明确的口头禅云: 蟒蛇的禅宗 )。



Answer 6:

简单的解决方案source='category.name' ,其中category是外键和.name它的属性。

from rest_framework.serializers import ModelSerializer, ReadOnlyField
from my_app.models import Item

class ItemSerializer(ModelSerializer):
    category_name = ReadOnlyField(source='category.name')

    class Meta:
        model = Item
        fields = __all__


文章来源: Retrieving a Foreign Key value with django-rest-framework serializers