django从多个表连接查询集

时间:2010-06-14 10:03:15

标签: django join django-queryset

如果我对多个表有查询,请执行以下操作:

d = Relations.objects.filter(follow = request.user).filter(date_follow__lt = last_checked)
r = Reply.objects.filter(reply_to = request.user).filter(date_reply__lt = last_checked)
article = New.objects.filter(created_by = request.user)
vote = Vote.objects.filter(voted = article).filter(date__lt = last_checked)

我希望显示按日期排序的所有结果(我的意思是不列出所有回复,然后是所有投票等)。 不知何故,我想在一个查询集中“加入所有这些结果”。 有可能吗?

2 个答案:

答案 0 :(得分:9)

您似乎需要不同的对象才能进行常规操作......

1)在这种情况下,最好在超类中抽象这些属性...我的意思是你可以有一个Event类来定义user字段,以及所有其他字段事件类会将其子类化。

class Event(model.Model):
    user = models.ForeignKey(User)
    date = ...

class Reply(Event):
    #additional fields

class Vote(Event):
    #additional fields

然后你就可以做到以下

Event.objects.order_by("date") #returns both Reply, Vote and Event

检查http://docs.djangoproject.com/en/1.2/topics/db/models/#id5以获取有关模型继承的信息。

2)您还可以拥有一个与另一个对象具有通用关系的Event模型。这对我来说听起来更干净,因为Vote在概念上不是“事件”。退房:http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#id1

无论如何,我认为你的问题是设计问题

答案 1 :(得分:1)

除了Sebastien的第2号提案:Django实际上还有一些内置功能,你可以“滥用”它;对于管理员来说,它已经有一个记录用户操作并通过通用外键关系引用对象的模型,我认为你可以对这个模型进行子类化并将其用于你的目的:

from django.contrib.admin.models import LogEntry, ADDITION
from django.utils.encoding import force_unicode
from django.contrib.contenttypes.models import ContentType

class MyLog(LogEntry):
    class Meta(LogEntry.Meta):
        db_table_name = 'my_log_table' #use another name here 

def log_addition(request, object):
    LogEntry.objects.log_action(
        user_id         = request.user.pk,
        content_type_id = ContentType.objects.get_for_model(object).pk,
        object_id       = object.pk,
        object_repr     = force_unicode(object),
        action_flag     = ADDITION
    )

您现在可以使用log_addition(request, object)记录所有通知等,并过滤日志表,而不是出于您的目的!如果你想记录更改/删除等,你可以为自己做一些辅助功能!