Фреймворк Django Rest, как получить количество объектов внешнего ключа внутри другого внешнего ключа

#python #django #django-models #django-rest-framework

#python #django #django-модели #django-rest-framework

Вопрос:

У меня есть три модели Store , Product и Order

 class Store(models.Model):
    ......

class Product(models.Model):
    store = models.ForeignKey(Store, ...)

class Order(models.Model):
    product = models.ForeignKey(Product ...)
    delivered = models.BooleanField()
  

Я хочу создать @property для Store модели, которая вычисляет количество заказов, в которых есть свои продукты, а также имеет delivered=True

как я буду это делать?

Комментарии:

1. Вы хотите, чтобы ваш сериализатор тоже сериализовал property ? Из вашего вопроса неясно.

2. ДА.. он будет добавлен в serializer.data для хранилища

Ответ №1:

В вашей модели хранилища определите property как обычно

 class Store(models.Model):
    ......
    
    @property
    def order_count(self):
        return Order.objects.filter(product__store=self, delivered=True).count()

class Product(models.Model):
    store = models.ForeignKey(Store, ...)

class Order(models.Model):
    product = models.ForeignKey(Product ...)
    delivered = models.BooleanField()

  

Затем в вашем сериализаторе у вас есть два способа включить order_count свойство в ваш сериализатор —

  1. Определите SerializerMethodField в StoreSerializer
 class StoreSerializer(serializers.ModelSerializer):
   order_count = serilizers.SerializerMethodField()

   def get_order_count(self, instance):
       return instance.order_count # the property in store object

   class Meta:
       model = Store
       fields = ['other', 'fields', 'in', 'store', 'model', 'order_count']

  
  1. Объявите order_count как ReadOnlyField в вашем StoreSerializer
 class StoreSerializer(serializers.ModelSerializer):
    order_count = serilizers.ReadOnlyField()

    class Meta:
        model = Store
        fields = ['other', 'fields', 'in', 'store', 'model', 'order_count']