Как объединить 3 таблицы в запросе с Django, комбинировать select related и prefetch_related - PullRequest
0 голосов
/ 29 августа 2018

У меня есть модели деревьев

class Category(models.Model):
    name = models.CharField(max_length=60)


class Product(models.Model):
    description = = models.CharField(max_length=255)
    category = models.ForeignKey(Category, related_name='products')


class Inventory(models.Model):
     userReservation = models.ForeignKey(User)
     Product=models.ForeignKey(Product related_name='products_reservation')
     Quantity = models.IntegerField()

Я хочу получить все товары по категориям, с количеством, зарегистрированным в инвентаре, для пользователя и товара

{
"id": 1,
"name": "Corbata",
"products": [{
        "id": 10,
        "description": "shoes",
        "quantitybyInventory": 3
    },
    {
        "id": 9,
        "description": "shirt",
        "quantitybyInventory": 1
    }]}

У меня есть представление с этим классом views.py

 class inventoryList(generics.ListCreateAPIView):

queryset = Category.objects.prefetch_related('products')
serializer_class = CategorybyProductSerializer
def get_object(self):
    queryset = self.queryset()
    obj = get_object_or_404(queryset)
    return obj

И мой сериализатор

class CategorybyProductSerializer(serializers.ModelSerializer):
products = ProductSerializer(many=True)

class Meta:
    model = Category
    fields = ('id', 'name', 'products')

class ProductSerializer(serializers.ModelSerializer):

class Meta:
    model = Product
    fields = ('id', 'description')

но я не могу показать сумму инвентарной таблицы

этот запрос просто покажет мне

{
"id": 1,
"name": "Corbata",
"products": [{
        "id": 10,
        "description": "shoes"
    },
    {
        "id": 9,
        "description": "shirt"
    }
]
}

1 Ответ

0 голосов
/ 30 августа 2018

Я использую SerializerMethodField , а этот пост

class ProductbyUserSerializer(serializers.ModelSerializer):
    quantitybyInventory = serializers.SerializerMethodField(read_only=True)

    def get_quantitybyInventory(self, product):
        return product.products_reservation.filter(userReservation = self.context['request'].user).count()

    class Meta:
        model = Product
        fields = ('id', 'description', 'quantitybyInventory')
...