嵌套的串行器与Django-Rest-Framework

Zna*_*fon 4 django django-rest-framework

我一直在尝试使用带DRF的嵌套序列化程序,但它不会在输出中显示相关项.

这是我的model.py:class Categorie(models.Model):nom = models.CharField(max_length = 100)

class Categorie(models.Model):
    nom = models.CharField(max_length=100)

    def __unicode__(self):
        return unicode(self.nom)

class Item(models.Model):
    nom = models.CharField(max_length=100)
    disponible_a_la_vente = models.BooleanField(default = True)
    nombre = models.IntegerField()
    prix = models.DecimalField(max_digits=5, decimal_places=2)
    history = HistoricalRecords()

    categorie = models.ForeignKey(Categorie, models.CASCADE)


    class Meta:
        verbose_name = "item"
        verbose_name_plural = u"inventaire"

        ordering = ['categorie', 'nom']

    def __unicode__(self):
        return u'{nom} - {nombre}'.format(nom = self.nom, nombre = self.nombre)
Run Code Online (Sandbox Code Playgroud)

和我的 serializers.py

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('nom',)

class CategorieSerializer(serializers.ModelSerializer):
    items = ItemSerializer(many=True)

    class Meta:
        model = Categorie
        fields = ('nom', 'id', 'items')
Run Code Online (Sandbox Code Playgroud)

我目前正在测试的视图非常基础:

class InventaireDetail(generics.RetrieveAPIView):
    queryset = Categorie.objects.all()
    serializer_class = CategorieSerializer
Run Code Online (Sandbox Code Playgroud)

但它给出了错误:

AttributeError:尝试items在序列化程序上获取字段值时获得AttributeError CategorieSerializer.序列化程序字段可能名称不正确,并且与Categorie实例上的任何属性或键都不匹配.原始异常文本是:'Categorie'对象没有属性'items'.

我一直在寻找一段时间,但即使在文档的帮助下我也无法使它工作.

Håk*_*Lid 8

Categorie.items不存在.默认情况下,反向关系将获得名称Categorie.item_set.您可以通过两种方式解决这个问题.

先:添加related_name到您的外键.

class Item(models.Model):
    categorie = models.ForeignKey(Categorie, models.CASCADE, related_name='items')
Run Code Online (Sandbox Code Playgroud)

或者:另一种解决方案是更改CategorieSerializer

class CategorieSerializer(serializers.ModelSerializer):
    items = ItemSerializer(many = True, read_only=True, source='item_set')
Run Code Online (Sandbox Code Playgroud)