Как реализовать order_by и group_by на одном и том же mysql запросе в Django - PullRequest
0 голосов
/ 14 мая 2019

У меня есть одна модель изображения и модель Resized_Image, в которой я изменю размеры моего исходного изображения на различные размеры и сохраняю их в модели Resized_Image. Когда я пытаюсь отфильтровать данные, они дают повторяющиеся результаты.

Вот моя модель:

class Image(models.Model):
    name=models.CharField(max_length=40,unique=True,help_text="name of the image")
    status = StatusField()

class Resized_image(models.Model):
    img = models.ForeignKey(Image, related_name='images', on_delete=models.CASCADE,)
    image=models.ImageField(upload_to=date_format,width_field='width', height_field='height',)
    width=models.PositiveIntegerField()
    height=models.PositiveIntegerField()

Мой сериализатор:

class resized_imagesSerializer(serializers.ModelSerializer):
    class Meta:
       model = Resized_image
       fields = ('image','width','height')

class imagesSerializer(QueryFieldsMixin,serializers.ModelSerializer):

   images =resized_imagesSerializer(many=True,required=False,read_only=True)
   image = Base64ImageField(write_only=True,)
   class Meta:
       model = Image
       fields = ('id','name','image','status','images')
       required = ['image']

Мой взгляд:

class ImageListView(mixins.CreateModelMixin,generics.ListAPIView):
     queryset = Image.objects.all()
     serializer_class = imagesSerializer
     def get_queryset(self):
        param = self.request.query_params.get("width", None)
        queryset = Image.objects.order_by(*param) 

     return queryset

Мой результат без фильтрации:

{
    "id": 1,
    "name": "abc",
    "status": 0,
    "images": [
        {
            "id": 1,
            "image": "/images/photos/2019/04/29/14b77119-5d7.png",
            "width": 720,
            "height": 200
           },
        {
            "id": 2,
            "image": "/images/photos/2019/04/29/Movies/medium/14b77119-5d7.png",
            "width": 720,
            "height": 1280

        }
    ]
}

Здесь, когда у меня есть несколько изображений с различными изображениями с измененным размером, если я пытаюсь упорядочить по ширине, я получаю повторяющиеся результаты (изображение с идентификатором 1 повторяется дважды) Как сделать group_by для упорядоченного набора запросов с помощью Django. Я использовал аннотирование, но это также дает тот же результат.

Image.objects.order_by(*ordering).annotate(Count('id'))

1 Ответ

0 голосов
/ 15 мая 2019

Попробуйте использовать подзапрос

min_query =
    Resized_image.objects.filter(image_id=OuterRef('id'))
    .order_by('width')
    .values('width', 'height', 'image')[:1]

Image.objects.all().annotate(
    width=Subquery(
        min_query.values('width'))
    ).annotate(
    height=Subquery(
        min_query.values('height'))
    ).annotate(
    image=Subquery(
        min_query.values('image'))
    )
...