按用户筛选反向关系,并在Django Rest框架中仅返回一个对象
鉴于这些模型:按用户筛选反向关系,并在Django Rest框架中仅返回一个对象,django,django-rest-framework,Django,Django Rest Framework,鉴于这些模型: class Product(models.Model): name = CharField(max_length=255) class Order(models.Model): product = models.ForeignKey(Product) user = models.ForeignKey(User) quantity = models.PositiveIntegerField() 每个产品用户只能有一个订单对象。我想要一个API调用
class Product(models.Model):
name = CharField(max_length=255)
class Order(models.Model):
product = models.ForeignKey(Product)
user = models.ForeignKey(User)
quantity = models.PositiveIntegerField()
每个产品用户只能有一个订单对象。我想要一个API调用来显示产品列表,以及用户的订单(如果有的话)。有办法吗
默认序列化列出order\u set
下的所有订单。我确实提前了一点按用户筛选:
class FilteredOrderSerializer(serialisers.ListSerializer):
def to_representation(self, data):
data = data.filter(user=self.context['request'].user)
return super(FilteredOrderSerializer, self).to_representation(data)
class OrderSerializer(serializers.ModelSerializer):
class Meta:
model = Order
list_serializer_class = FilteredOrderSerializer
class ProductSerializer(serializers.ModelSerializer):
order_set = OrderSerializer(many=True, read_only=True)
class Meta:
model = Product
因此,现在它只显示经过身份验证的用户的顺序,但生成的JSON看起来像
[
{
"name": "prod1",
"order_set": [
{
"quantity": 4
}
],
}
]
i、 e.该字段仍然被称为order\u set
,它是一个列表,而我希望它被称为order
,并且是一个对象或null。因此,我不确定该在何处进行过滤,也不确定如何定义字段
编辑:我正在使用一个简单的视图集
class ProductViewSet(view sets.ReadOnlyModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
您需要在订单中添加相关的_name字段,以便
product.orders.all()
那就这样吧
class Order(models.Model):
product = models.ForeignKey(Product, related_name='orders')
user = models.ForeignKey(User)
quantity = models.PositiveIntegerField()
class ProductSerializer(serializers.ModelSerializer):
order = serializers.SerializerMethodField()
class Meta:
model = Product
fields = ('name', 'order')
def get_order(self, object):
try:
order = object.orders.get(user=self.context['request'].user)
return SceneDetailSerializer(order).data
except Order.DoesNotExist:
return None
更新:您可以尝试序列化程序方法字段。不确定self是否包含上下文和用户引用。您需要从订单序列化程序中删除listfield。让我知道它是否有效 将需要有关视图的一些详细信息。在上面添加了视图集ProductSerializer的外观如何?修复程序就在那里。我们刚刚添加了ProductSerializer,它现在就在那里;)这仍然会返回一个列表,这是我的主要问题。我知道每个产品每个用户都会有一个或没有订单,所以我想返回单个订单或空订单。它是否被称为
order\u set
或orders
并不重要。(order
会更好)那种方法行得通!我必须返回OrderSerializer(order).data
,然后得到我要寻找的JSON。不幸的是,SerializerMethodFields是只读的,但我正试图找到一种解决方法。