如何在Django中过滤多对多关系

时间:2014-07-28 07:49:13

标签: python django django-models django-orm

由于我找不到确切的答案,我决定问。 我有以下两种型号:

class Schedule(models.Model): 
     transport = models.ForeignKey(Transport) 
     stop = models.ForeignKey(Stop) 
     from_to_stop = models.ForeignKey(Direction) 
     time = models.ManyToManyField(TimeTable) 
     type_day = models.ForeignKey(TypeDay) 

     created = models.DateTimeField(_('Created at'), auto_now_add = True) 
     updated = models.DateTimeField(_('Modified at'), auto_now = True) 


class TimeTable(models.Model): 
     time_arrival = models.TimeField() 

     created = models.DateTimeField(_('Created at'), auto_now_add = True) 
     updated = models.DateTimeField(_('Modified at'), auto_now = True) 

必须在“time”的“Schedule”字段中动态添加内容的脚本。这是我的所作所为:

time = self.get_or_create_time(time) 
count = Schedule.objects.filter(time__in = [time]).count() 
if not count: 
    schedule.time.add(time)


def get_or_create_time(self, time):
    obj, created = TimeTable.objects.get_or_create(time_arrival=time)
    return obj

这里我没有得到所需的结果,因为如果某处有这样的连接,它会搜索整个表格。我想看看是否只有当前对象的这种链接'schedule'是当前对象。我只想让他看看是否与'TimeTable'有关联。如何在Django中执行此操作?

1 个答案:

答案 0 :(得分:1)

首先,将__in与单个元素一起使用是没有意义的,然后将其包装在列表中。你必须这样做的事实应该给你一个暗示你使用了错误的谓词:只使用默认值(__eq,但因为它是默认值,你可以完全不用它)。

此外,如果您只想知道某个对象是否存在,请使用.exists()而不是.count(),因为如果有多个对象,后者是一个更昂贵的查询。

但基本上你的问题很简单。您希望过滤属于计划的时间:因此,请从该计划开始,而不是整个计划模型。

exists = self.times.filter(time_arrival=time.time_arrival).exists()