从Django ORM中提取外部连接

2024-10-04 07:35:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我的项目中有以下两个模型。你知道吗

class Blog(models.Model):   
    title=models.CharField(max_length=20, blank=False, default='')
    content=models.CharField(max_length=2000, blank=False, default='')

class UserLikedBlogs(models.Model):
    blog=models.ForeignKey(TTSServiceModel.TTSService, on_delete=models.CASCADE, blank=True, null=True)
    user=models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

所有登录的用户都可以看到其他用户的博客。当前登录的用户可以“喜欢”某个博客,这会在UserLikedBlogs表中添加一个条目。你知道吗

我现在希望向登录的用户显示系统中存在的所有博客,但我也希望显示用户喜欢的博客。你知道吗

我知道这应该从Blog表中获取所有条目,并从UserLikedBlogs表中获取额外的列,其中数据只针对用户喜欢的Blog,而不是其他。你知道吗

这是一个典型的外部联接情况,其中两个集合之间的公共元素与参与联接的其中一个表中的所有元素相关联。你知道吗

我一直在阅读django等的文档,但我似乎找不到合适的语法来做这件事。你知道吗

我目前的方法是使用Pandas并用Python连接这两个数据集,而不是查询。我肯定有更好的办法,但就是找不到。你能帮忙吗?你知道吗


Tags: 用户falsedefaultmodelonmodelsblogdelete
3条回答

或许你可以这样尝试:

Blog.objects.filter(userlikedblogs__user=request.user)

这里我使用UserLikedBlogsBlog之间的^{}来获得用户喜欢的博客。你知道吗


根据OP在此答案底部添加的评论进行更新:

在这里,如果用户喜欢或不喜欢博客,基本上你需要对信息进行注释。您可以使用^{}这样做:

from django.db.models import Case, Value, BooleanField

blogs = Blog.objects.annotate(
     liked=Case(
         When(userlikedblogs__user=request.user, then=Value(True)),
         default=Value(False),
         output_field=BooleanField(),
     )
)

并在template中使用这些博客(当您通过上下文从视图发送到模板时):

{% for blog in blogs %}
    {% if blog.liked %}
        <a style="background:blue" href="{% url 'blog:detail' blog.pk %}">{{ blog.title }}</a>
    {% else %}
        <a style="background:green" href="{% url 'blog:detail' blog.pk %}">{{ blog.title }}</a>
    {% endif %}
{% endfor %}

All blogs are visible, in green color font. Some of the blogs are liked by the user, and those have to show up as blue color font.

这意味着您要查询所有博客,但有一种方法可以告诉您当前用户最喜欢哪个博客。您可以通过在为模板构建queryset时使用annotate来实现这一点

Blog.objects.annotate(is_favorite=Exists(UserLikedBlogs.objects.filter(blog=OuterRef('pk'), user=request.user)))

然后在模板中,您可以简单地检查blog.is_favorite,看看它是否适合当前用户

最后我做了以下几件事

allLikedBlogs=Blogs.objects.all().values('title', 'content', 'userlikedblogs__user')

这导致ORM进行左外连接。你知道吗

相关问题 更多 >