django视图中的多模型过滤

时间:2010-10-08 21:14:25

标签: django django-models

我正在尝试从特定模型中获取查询。我无法正确过滤数据。

我已经修复了一个错误,它返回了其他用户数据,但现在它返回了模型中一行数据的副本。

events = Event.objects.filter(club=user.get_profile().main_club) | Event.objects.filter(invclub=user.get_profile().main_club) | Event.objects.filter(invited=user)

这是我正在尝试执行的查询。

我的目标是,让用户手动邀请所有活动(邀请)他们的俱乐部已被邀请(invclub)或者他们的俱乐部是主办俱乐部(俱乐部)

我可能在错误的方向上接近这个,并且可能更容易做到这一点。非常感谢任何帮助。

编辑:comms.models

class Event(models.Model):
     title = models.CharField(max_length='255')
     club = models.ForeignKey(Club, verbose_name="Host Club")
     invclub = models.ManyToManyField(Club, verbose_name="Invited Clubs", related_name="Invited Clubs", blank=True)
     l_desc = models.CharField(max_length='255', verbose_name="Location Description")
     l_long = models.CharField(max_length='255', verbose_name="Longitude", blank=True)
     l_lat = models.CharField(max_length='255', verbose_name="Latitude", blank=True)
     edate = models.DateTimeField(default=datetime.now, verbose_name="Event Date", blank=True)
     length = models.CharField(max_length='255', verbose_name="Event Length", blank=True)
     invited = models.ManyToManyField(User, related_name="Invited Users", blank=True)
     attending = models.ManyToManyField(User, related_name="Attending Users", blank=True)
     declined = models.ManyToManyField(User, related_name="Declined Users", blank=True)
     description = models.TextField(blank=True)

修正:

最终解决方案使用下面建议的Q()对象,同时附加.distinct()函数以确保不返回重复项。

1 个答案:

答案 0 :(得分:5)

您正在做的是进行三次独立查询并将它们一起进行OR运算。我对此感到惊讶。

相反,您需要的是一个带有三个条件的查询,它们被一起进行OR运算。您可以通过Q()个对象在Django中实现此目的:

from django.db.models import Q
main_club = user.get_profile().main_club
events = Event.objects.filter(Q(club=umain_club) | Q(invclub=main_club) | Q(invited=user))