在反向关系上添加序列化程序-Django Rest框架

在反向关系上添加序列化程序-Django Rest框架,django,rest,django-rest-framework,Django,Rest,Django Rest Framework,我有一个Cart模型和一个CartItem模型。CartItem模型有一个ForeignKey到Cart模型 使用Django Rest框架,我有一个视图,API用户可以在其中显示购物车,显然,然后我想在响应中包括购物车项目 我将序列化程序设置为: class CartSerializer(serializers.ModelSerializer): user = UserSerializer(read_only=True) cartitem_set = CartItemSeria

我有一个
Cart
模型和一个
CartItem
模型。
CartItem
模型有一个
ForeignKey
Cart
模型

使用Django Rest框架,我有一个视图,API用户可以在其中显示
购物车
,显然,然后我想在响应中包括
购物车项目

我将序列化程序设置为:

class CartSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True)
    cartitem_set = CartItemSerializer(read_only=True)
    class Meta:
        model = Cart
        depth = 1
        fields = (
            'id', 
            'user', 
            'date_created', 
            'voucher', 
            'carrier', 
            'currency', 
            'cartitem_set', 
        )
class CartSerializer(serializers.ModelSerializer):
    cartitem_set = CartItemSerializer(read_only=True, many=True) # many=True is required
    class Meta:
        model = Cart
        depth = 1
        fields = (
            'id', 
            'date_created', 
            'voucher', 
            'carrier', 
            'currency', 
            'cartitem_set', 
        )
我的问题是第二行,
cartitem\u set=CartItemSerializer(read\u only=True)

我听到AttributeErrors说,
“RelatedManager”对象没有属性“product”
。(“product”是
CartItem
模型中的一个字段。如果我从
CartItemSerializer
中排除product,我只会在下一个字段中获得一个新的AttributeError,依此类推。无论我在序列化器中只保留1个或所有字段,我都会得到一个错误

我的猜测是,出于某种原因,Django REST框架不支持添加序列化程序来反转这样的关系。我错了吗?我应该怎么做

PS


我之所以要使用
CartItemSerializer()
,是因为我想控制响应中显示的内容。

在模型中定义相关名称并在序列化器关系中使用该相关名称很重要:

class Cart(models.Model):
   name = models.CharField(max_length=500)

class CartItem(models.Model):
   cart = models.ForeignKey(Cart, related_name='cart_items')
   items = models.IntegerField()
然后在序列化程序定义中使用这些确切名称:

class CartSerializer(serializers.ModelSerializer):
    cart_items = CartItemSerializer(read_only=True)
    class Meta:
       model = Cart
       fields = ('name', 'cart_items',)

Ahmed Hosny的回答是正确的。它要求将
many
参数设置为
True
才能工作

因此,
CartSerializer
的最终版本如下所示:

class CartSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True)
    cartitem_set = CartItemSerializer(read_only=True)
    class Meta:
        model = Cart
        depth = 1
        fields = (
            'id', 
            'user', 
            'date_created', 
            'voucher', 
            'carrier', 
            'currency', 
            'cartitem_set', 
        )
class CartSerializer(serializers.ModelSerializer):
    cartitem_set = CartItemSerializer(read_only=True, many=True) # many=True is required
    class Meta:
        model = Cart
        depth = 1
        fields = (
            'id', 
            'date_created', 
            'voucher', 
            'carrier', 
            'currency', 
            'cartitem_set', 
        )

明智的做法是共享您的整个代码,即模型和序列化程序类。不过,这可能有助于调试您的错误

我的序列化程序类

现在来看模型

有关django rest框架中关系的详细概述,请参考他们的官方


尝试
cartitem\u set=CartItemSerializer(read\u only=True,many=True)
您的cartitem模型外键是什么样子的?这并没有解决问题。当我尝试使用
cart\u items=CartItemSerializer(read\u only=True)时,仍然获取
“RelatedManager”对象没有属性“product”
错误
在最初的问题中,他保留了隐含的相关名称:cartitem\u set我们可以将名称cartitem\u set更改为items吗?您可以通过执行以下操作来更改名称:items=CartItemSerializer(read\u only=True,many=True,source='cartitem\u set')。您可以从相关名称更改cartitem\u set名称。在类cartitem:cart=models.ForeignKey中(购物车,相关的物品),然后在“字段”中在序列化程序中,您必须使用name items。如果可以使用此解决方案,然后过滤集合中返回的项?该解决方案的语法是什么样的?我当前已将source set设置为source='cartitem_set'以更改名称,但由于它是一个字符串,我将如何向其中传递筛选器或查询集?感谢您的帮助Marcus。