Проблема передачи queryset фреймворка отдыха Django
У меня есть проблема в течение нескольких дней, но так и не получил никакого решения, я пробовал разные подходы, но без успеха. Я хочу передать несколько наборов запросов в одном представлении или пути.
@api_view(['GET'])
def getProduct(request, pk):
product = Product.objects.get(_id=pk)
related = Product.objects.filter(category=product.category).exclude(_id=pk).order_by('?')[:4]
print(related)
serializer = ProductSerializer(product, many=False)
return Response(serializer.data)
Я хочу передать связанный набор запросов о товаре, который связан здесь в том же представлении. В первой секции я буду показывать детали продукта, что работает, а в следующей секции я хочу показать связанный продукт, но теперь Как я могу применить это?
Я получил некоторое решение, которое подсказало мне, что нужно обратиться к сериализаторам и изменить там. Но я так не думаю, потому что я пробовал, но как это возможно. Так что у кого-нибудь есть лучшее решение. Мой связанный объект имеет тот же сериализатор, который является producterializer. но в конечном итоге это связанный продукт.
#это мой класс сериализатора
class ProductSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Product
fields = '__all__'
def get_user(self, obj):
user = obj.user
serializer = VendorSerializer(user, many=False)
return serializer.data
Вы можете реализовать ProductWithRelatedSerializer
, который использует ProductSerializer
для сериализации продуктов. Таким образом, мы создаем подкласс из ProductSerializer
:
class ProductWithRelatedSerializer(ProductSerializer):
related = serializers.SerializerMethodField(read_only=True)
def get_related(self, obj):
related = Product.objects.filter(
category_id=obj.category_id
).exclude(_id=obj.pk).order_by('?').select_related('user')[:4]
ps = ProductSerializer(related, many=True)
return ps.data
В .select_related(…)
[Django-doc] нет необходимости, но это увеличит get_user
метод ProductSerializer
для связанных продуктов.
Таким образом, ответ будет выглядеть следующим образом:
{
/* … */
"user": {
…
},
related: [
{ "user": { … } },
{ "user": { … } },
{ "user": { … } },
{ "user": { … } }
]
}