如果我对多个表有查询,请执行以下操作:
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)
我希望显示按日期排序的所有结果(我的意思是不列出所有回复,然后是所有投票等)。 不知何故,我想在一个查询集中“加入所有这些结果”。 有可能吗?
答案 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)
记录所有通知等,并过滤日志表,而不是出于您的目的!如果你想记录更改/删除等,你可以为自己做一些辅助功能!