簡體   English   中英

如何在Django中注釋一個相關的model的值

[英]How to annotate a value from a related model in Django

我有一個帖子 model:

class Post(models.Model, NiceTextPrintMixin):
    text = models.TextField()
    pub_date = models.DateTimeField("date published",
                                    auto_now_add=True,
                                    db_index=True)
    author = models.ForeignKey(User,
                               on_delete=models.CASCADE,
                               related_name="posts")
    group = models.ForeignKey(Group,
                              on_delete=models.SET_NULL,
                              blank=True,
                              null=True,
                              related_name="posts",
                              )
    image = models.ImageField(upload_to='posts/', blank=True, null=True)

和一個贊 model:

class Like(models.Model):
    post = models.ForeignKey(Post,
                             on_delete=models.CASCADE,
                             blank=False,
                             null=False,
                             related_name="likes")

    user = models.ForeignKey(User,
                             on_delete=models.CASCADE,
                             blank=False,
                             null=False,
                             related_name="likes")

    value = models.IntegerField()

我需要的是將一個字段注釋為 Post 查詢集,該查詢集將包含來自 Like model 的“值”值,其中 post_id=corresponding post_id 和 user=request.user 如果存在這樣的記錄,則為 0(無也可以)它沒有。 有沒有辦法以簡單的注釋方式完成這項工作?

您不能在@property 中傳遞 arguments。 您可以為 Post 實現方法:

def get_like_value(user):
    try:
        like = Like.objects.get(user = user, post = self,)
        return like.value
    catch Like.DoesNotExist:
        return 0

也許試試這個

from django.db.models import Count, Case, When, IntegerField
posts_wth_like = Post.objects.all().annotate(count_like=Count(Case(When(likes__user=user, then=1),output_field=IntegerField(),)))

如果用戶喜歡 = 1,否則為 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM