在反向关系上添加序列化程序-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。