2015-03-26 3 views
0

У меня есть такие модели, как следующим образом:Джанго QuerySet фильтр над столиками

class Node(models.Model): 
    name = models.CharField(max_length=128) 
    user = models.Foreignkey(User) 

    class Meta: 
     db_table = 'node' 

class Thing(models.Model): 
    user = models.ForeignKey(User) 
    begin_time = models.DateTimeField() 
    node = models.ManyToManyField(Course) 

    class Meta: 
     db_table = 'thing' 

class NodeLog(models.Model): 
    actor = models.ForeignKey(User) 
    node = models.ForeignKey(Node, related_name='nodelog_node') 
    action_time = models.DateTimeField() 
    result = models.CharField(max_length=128) 

    class Meta: 
     db_table = 'node_log' 

И данные, такие как следующие:

table: node 
+----+-------+---------+ 
| id | name | user_id | 
+----+-------+---------+ 
| 1 | node1 | 101  | 
+----+-------+---------+ 
| 2 | node2 | 102  | 
+----+-------+---------+ 

table: thing 
+----+---------+---------------------+ 
| id | user_id | begin_time   | 
+----+---------+---------------------+ 
| 1 | 1  | 2015-01-01 03:00:00 | 
+----+---------+---------------------+ 

table: thing_node 
+----+----------+---------+ 
| id | thing_id | node_id | 
+----+----------+---------+ 
| 1 | 1  | 1  | 
+----+---------+----------+ 
| 2 | 1  | 2  | 
+----+---------+----------+ 

table: node_log 
+----+----------+---------+------------------------------+ 
| id | actor_id | node_id | action_time  | result | 
+----+----------+---------+------------------------------+ 
| 1 | 101  | 1  |2015-01-01 01:00:00 | agree | 
| 2 | 102  | 2  |2015-01-01 02:00:00 | agree | 
| 3 | 101  | 1  |2015-01-01 04:00:00 | agree | 
+----+----------+---------+--------------------+---------+ 

Если кто-то согласился и его action_time больше BEGIN_TIME, он не может согласиться снова , поэтому я исключаю следующее:

Thing.objects.filter(***).exclude(node__nodelog_node__action_time__gt=F('begin_time'), node__nodelog_node__actor=request.user) 

request.user - 102, а результат - []. Результат

Thing.objects.filter(***) 

прав, любое предложение? Благодаря!

ответ

0

Я думаю, что проблема может заключаться в том, что исключает не ведет себя как фильтр. В исключить условия не должны держаться вместе (т.е. не являются и-е изд)

from the docs

Поведение фильтра() для запросов, которые охватывают многозначные отношения, как описано выше , не выполняется эквивалентно для exclude(). Вместо этого условия в одном вызове exclude() не будут обязательно ссылаться на один и тот же элемент. Например, следующий запрос исключит блоги, которые содержат как записи с «Lennon» в заголовок и данные, опубликованные в 2008 году:

Blog.objects.exclude(
    entry__headline__contains='Lennon', 
    entry__pub_date__year=2008, 
) However, unlike the behavior when using filter(), this will not limit blogs based on entries that satisfying both conditions. In order 

, чтобы сделать это, то есть, чтобы выбрать все блоги, которые не содержат записей опубликованные с «Lennon», которые были опубликованы в 2008 году, что вам нужно сделать два запроса:

Blog.objects.exclude(
    entry=Entry.objects.filter(
     headline__contains='Lennon', 
     pub_date__year=2008, 
    ), 
) 
Смежные вопросы