我有3张桌子。用户,发布和共享。帖子是包含所有帖子的表格。 Post与Share有一对多的关系。就是说,Share表是一个表,它指示用户共享了哪些帖子。这是表格的结构:
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
status = models.CharField(max_length=200)
share_count = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)
url = models.CharField(max_length=150)
class Share(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
shared_at = models.DateTimeField(auto_now_add=True)
我想要的是一个查询,该查询获取用户共享的帖子和用户创建的帖子。例如,假设我们有相同的数据:
发布表
id user status share_count created_at url
1 1 hello 32 2017-06-01 hello
2 2 What's up 22 2017-07-01 whats-up
共享表格
post user shared_at
2 2 2017-07-02
我想要一个查询,该查询将获取用户的共享帖子及其帖子。假设我要为用户1执行此操作。结果应该是帖子1和帖子2,因为该用户发布了帖子1,还共享了用户2的帖子2。我已经进行了此查询,但是由于某种原因,只有共享的帖子是显示的,而不是用户的帖子。如何使用户的帖子与他们的共享帖子一起显示?可以在一个查询中做到吗?
Share.objects.all().select_related('post').filter(user=1)
答案 0 :(得分:2)
您可以从User
模型中进行查询,因为它对两者都是通用的。
user = User.objects.get(pk=1) # pick a user
own_posts = user.post_set.all()
shared_posts = user.share_set.all()
要对这些邮件进行排序,以使您拥有最近5篇帖子的组合列表,则必须按其时间戳排序帖子,然后对其进行过滤:
from itertools import chain
user = User.objects.get(pk=1) # pick a user
own_posts = user.post_set.order_by('-created_at')
shared_posts = user.share_set.order_by('-shared_at')
combined = itertools.chain(own_posts, shared_posts)
def get_ts(obj):
try:
return obj.created_at
except AttributeError:
return obj.shared_at
last_5 = sorted(combined, key=get_ts, reverse=True)[:5]
答案 1 :(得分:0)
您不会在单个查询中获得这两个模型实例(据我所知:()。
试试这样的
def get_post(user_id):
return {"post": Post.objects.filter(user=user_id),
"share": Share.objects.filter(user=user_id)}
如果您正在寻找SQL JOIN
之类的东西,请使用Django ORM的.valus()
方法