Аннотировать кверинг, пк

Я спросил,

Как я должен составлять запросы, когда использую pk с annotate?

Мне нужно перенаправление на профиль пользователя, когда гость нажимает на ссылку.

Модели

class Posty(models.Model):
   title = models.CharField(max_length=250, blank=False, null=False, unique=True)
   sub_title = models.SlugField(max_length=250, blank=False, null=False, unique=True)
   content = models.TextField(max_length=250, blank=False, null=False)
   image = models.ImageField(default="avatar.png",upload_to="images", validators=[FileExtensionValidator(['png','jpg','jpeg'])])
   author = models.ForeignKey(Profil, on_delete=models.CASCADE)
   updated = models.DateTimeField(auto_now=True)
   published = models.DateTimeField(auto_now_add=True)
   T_or_F = models.BooleanField(default=False)
   likes = models.ManyToManyField(Profil, related_name='liked')
   unlikes = models.ManyToManyField(Profil, related_name='unlikes')
   created_tags = models.ForeignKey('Tags', blank=True, null=True, related_name='tagi', on_delete=models.CASCADE)

class CommentPost(models.Model):
   user = models.ForeignKey(Profil, on_delete=models.CASCADE)
   post = models.ForeignKey(Posty, on_delete=models.CASCADE, related_name="comments")
   content1 = models.TextField(max_length=250, blank=False, null=False)
   date_posted = models.DateTimeField(default=timezone.now)
   date_updated = models.DateTimeField(auto_now=True)

def __str__(self):
    return str(self.content1)

Виды

   if tag == None:
    my_tag = Posty.objects.annotate(
        latest_comment = Subquery(CommentPost.objects.filter(post=OuterRef('id')).values('content1').order_by('-date_posted')[:1]),
        my_author=Subquery(CommentPost.objects.filter(post=OuterRef('id')).values('user__user__username').order_by('-date_posted')[:1]),
    )

Я получил правильное имя пользователя, но не могу получить правильное перенаправление enter image description here

К сожалению, вам необходимо аннотировать информацию CommentPost о id в кверисете так же, как вы добавили информацию username. В итоге получится много подзапросов, добавленных к исходному набору запросов. Я бы предложил использовать prefetch related для предварительной загрузки информации CommentPost в исходный кверисет (для уменьшения количества обращений к БД) и прямого доступа к этой информации из шаблона. Например:

# view
my_tag = Posty.objects.prefetch_related('commentpost_set')

# template
{% for post in my_tag %}
    <span><a href="{% url 'home:detail_post' post.pk %}"> {{post.commentpost_set.last.content1}}</a><span>
    <span><a href="{% url 'home:detail_post' post.commentpost_set.last.user.pk %}"> {{post.commentpost_set.last.user.username}}</a><span>
{% endfor %}

Кроме того, last - это функция queryset, которая возвращает последний объект данного queryset. Я могу получить доступ к кверисету CommentPost из объекта Posty путем обратного запроса .

Вернуться на верх