繁体   English   中英

什么是最好的django方式来执行跨越几个表的查询?

[英]What's the best django way to do a query that spans several tables?

我有一个评论/评级网络应用程序,一个Digg。 我的django app content有以下型号:

class Content(models.Model):
    title = models.CharField(max_length=128)
    url = models.URLField(max_length=2048)
    description = models.TextField(blank=True)

class Recommendation(models.Model):
    user = models.ForeignKey(User)
    content = models.ForeignKey(Content)
    review = models.TextField()
    rating = models.PositiveSmallIntegerField()
    class Meta:
        unique_together = ('user', 'content')

class Subscription(models.Model):
    subscriber = models.ForeignKey(User, related_name='subscription_set')
    publisher = models.ForeignKey(User, related_name='publication_set')
    class Meta:
        unique_together = ('subscriber', 'publisher')

我想构建一个页面,其中包含当前用户( request.user )订阅的所有用户的所有建议。

如果我在SQL中写这个,我相信我最终会得到类似于以下内容的查询:

select content_content.*, content_recommendation.*, auth_user.*
from content_content, content_recommendation, content_subscription, auth_user
where content_content.id = content_recommendation.content_id
 and content_recommendation.user_id = content_subscription.publisher_id 
 and content_subscription.subscriber_id = ?
 and auth_user.id = content_subscription.publisher_id;

我如何使用Django的查询API表达这一点? 我已经阅读了文档,但是我无法理解它。

我会用:

Recommendation.objects.filter(user__publication_set__subscriber=request.user).select_related()

这将按照您的请求获取所有推荐对象,并且select_related会将所有相关的用户和内容对象加载到内存中,以便后续访问它们不会再次访问数据库。

但是,如何构建此查询确实与之后处理返回的数据有很大关系。 根据您使用它的方式,单向和另一种方式可能或多或少有效。 alt text http://sonicloft.net/im/52

我认为这是:

  Content.objects.filter(recommendation_set__user__publication_set__subscriber__pk=request.user.pk)/.distinct()/

要么

  Recommendation.objects.filter(user__publication_set__subscriber__pk=request.user.pk)/.distinct()/

- 取决于您想要获得哪种型号的实例。 可能需要使用Distinct()来避免重复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM