从两个表中获取帖子?

时间:2018-07-14 23:37:35

标签: python django django-models

我有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)

2 个答案:

答案 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()方法