DRF получает 2 ряда с большим количеством, чем другие - PullRequest
0 голосов
/ 28 мая 2018

У меня есть какая-то строка в таблице, я хочу получить только 2 записи, которые имеют большее значение, чем другие.на данный момент по моим счетам 50 и 80 должны быть возвращены.

у меня должен быть список product_ids (только 2 записи), которые имеют count больше, чем другие .. так что я должен попробовать values_list я знаю этонеправильно, как я могу это исправить?

prod_ids = ProductViewCount.objects.all (). aggregate (Max ('count')). values_list ('product', flat = True)

это мой полный код:

class ViewTopLiked(APIView):
    def get(self, request):
        prod_ids = ProductViewCount.objects.all().aggregate(Max('count')).values_list('product', flat=True)

        obj = Product.objects.filter(product_id__in=prod_ids).order_by('-created_date')

        serializer = ProductSerializer(instance=obj, many=True, context={'request': request})

        return Response(serializer.data)

table img

productViewcount модель: модель:

class ProductViewCount(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, to_field='product_id',
                                related_name='count')

    count = models.IntegerField(null=True, blank=True, default=0)

Модель продукта:

class Product(models.Model):
    PRO = 'P'
    INTER = 'I'
    BEGINER = 'B'
    ALL = 'A'

    TYPE_CHOICE = ((PRO, 'P'), (INTER, 'I'), (BEGINER, 'B'), (ALL, 'A'))

    product_id = models.AutoField(primary_key=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, db_index=True)
    title = models.CharField(max_length=200)
    video_length = models.IntegerField(null=True, blank=True)
    mini_description = models.CharField(max_length=1000, null=True, blank=True)
    full_description = models.TextField(null=True, blank=True)
    price = models.IntegerField(null=True, blank=True)
    free = models.BooleanField(default=False)
    video_level = models.CharField(max_length=20, choices=TYPE_CHOICE, default=ALL)
    created_date = models.DateTimeField(auto_now_add=True)
    updated_date = models.DateTimeField(auto_now=True)
    publish = models.BooleanField(default=False)
    draft = models.BooleanField(default=False)
    slug = models.SlugField(allow_unicode=True, null=True, blank=True)
    image = models.FileField(upload_to=upload_to_custom_p, null=True, blank=True)
    lecture = models.IntegerField(null=True, blank=True)

    def __str__(self):
        return self.title

    @property
    def owner(self):
        return self.author

1 Ответ

0 голосов
/ 28 мая 2018

Для заказа вы можете использовать количество related_name в наборе запросов продукта, чтобы получить только первые два элемента, используйте нарезку [:2]:

obj = Product.objects.order_by('-count__count')[:2]

serializer = ProductSerializer(instance=obj, many=True, context={'request': request})

return Response(serializer.data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...