使用Django-Rest-Framework的嵌套序列化器

6
我将尝试使用DRF中的嵌套序列化器,但输出中没有显示相关项。
这是我的model.py文件:
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)

和我的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')

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

class InventaireDetail(generics.RetrieveAPIView):
    queryset = Categorie.objects.all()
    serializer_class = CategorieSerializer

但是它给出了错误:

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

我已经寻找了一段时间,但即使在文档的帮助下,我也无法使其工作。

1个回答

10

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

方法一:在外键上添加related_name属性。

class Item(models.Model):
    categorie = models.ForeignKey(Categorie, models.CASCADE, related_name='items')

另一种解决方法是更改CategorieSerializer。

class CategorieSerializer(serializers.ModelSerializer):
    items = ItemSerializer(many = True, read_only=True, source='item_set')

谢谢,显然就是那个问题。你帮我省了很多麻烦。 - Znafon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接