Аннотировать кверинг, пк
Я спросил,
Как я должен составлять запросы, когда использую 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]),
)
Я получил правильное имя пользователя, но не могу получить правильное перенаправление
К сожалению, вам необходимо аннотировать информацию 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
путем обратного запроса .