按用户筛选反向关系,并在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是只读的,但我正试图找到一种解决方法。