@reqww

Как бы так правильно написать аннотацию?

Есть модель юзера:
class Contact(AbstractBaseUser, PermissionsMixin):
    '''Кастомная модель пользователя'''
    email = models.EmailField(verbose_name='email', max_length = 60, unique = True)
    slug = models.SlugField(default='')
    first_name = models.CharField(max_length=30, default = '')
    last_name = models.CharField(max_length=30, default = '')
    phone_number = models.CharField(max_length=11)
    date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add = True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now = True)
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    avatar = models.ImageField(upload_to='user_avatars/%Y/%m/%d', blank=True)
    compressed_avatar = models.ImageField(upload_to='compressed_user_avatars/%Y/%m/%d', blank=True)
    small_avatar = models.ImageField(upload_to='small_user_avatars/%Y/%m/%d', blank=True)
    is_active = models.BooleanField(default=False)


Есть модель фотографии:
class Photo(models.Model):
    '''Фотография'''
    owner = models.ForeignKey(Page, related_name='photos', on_delete=models.CASCADE)
    picture = models.ImageField(upload_to='picture/%Y/%m/%d')
    compressed_picture = models.ImageField(upload_to='compressed_picture/%Y/%m/%d')
    small_picture = models.ImageField(upload_to='small_picture/%Y/%m/%d')
    likes = models.ManyToManyField(Like)
    comments = models.ManyToManyField(Comment)
    timestamp = models.DateTimeField(auto_now_add=True)


Есть detail-view на модель Contact и в ней перегруженный get_queryset():
def get_queryset(self):
         pk = int(self.kwargs['pk'])
        queryset = Contact.objects.filter(id=pk).annotate(
            is_friend=Count('my_page__friends', filter=Q(my_page__friends=self.request.user))
        ).annotate(
            num_friends=Count('my_page__friends', distinct=True)
        ).annotate(
            current_user=Count('slug', filter=Q(slug=self.request.user.slug))
        ).annotate(
            is_sent=Exists(
                AddRequest.objects.filter(
                    sender__id=self.request.user.id, 
                    receiver__id=pk
                )
            )
        ).annotate(
            is_sent_to_you=Exists(
                AddRequest.objects.filter(
                    sender__id=pk, 
                    receiver__id=self.request.user.id
                )
            )
        ).annotate(
            chat_id=Avg('chats__id', filter=Q(chats__participants=self.request.user))
        )
        return queryset


Очень бы хотелось при выводе всей этой информации о пользователе выводить еще айди текущей аватарки, у меня при смене аватарки автоматически создается сущность типа Photo, где адреса картинок такие же, как на самой аватарке, которая сидит в модели Contact
Я пытался сделать что-то вот такое:
queryset = queryset.annotate(
                photo_id=Sum('my_page__photos__id', filter=Q(my_page__photos__picture=OuterRef('avatar')))
            )


По итогу я получаю 404, хотя поле avatar не пустое.

Можно сделать кривое решение через условный оператор, но оно не очень эффективное

Благодарность за любую помощь!

(my_page - это сущность, связывающая между собой пользователя и еще некоторые другие сущности, это не так важно, важно, что таким образом из юзера можно получить список его фотографий; Описал просто для более четкого понимания картины)
  • Вопрос задан
  • 58 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы