2014-01-18 3 views
0

Я два класса модели и через класс, как:Django модель, как добавить условие фильтра сквозной модели поля

class Terms(models.Model): 
    name = models.CharField(max_length=64) 
    posts = models.ManyToManyField("Post", through="TermRelation") 

class Post(models.Model): 
    title = models.CharField(max_length=120) 
    content = models.TextField() 
    published_on = models.DateTimeField(auto_now_add=True) 

    # Categories and Tags 
    terms = models.ManyToManyField("Term", through="TermRelation") 

class TermRelation(models.Model): 
    class Meta: 
     db_table = "tbl_term_relation" 
     unique_together = (
      ("term", "term_type", "post"), 
     ) 

    CITES = (
     ('CAT', 'Category'), 
     ('TAG', 'Tag'), 
    ) 

    term = models.ForeignKey(Term, db_column="id_term") 
    post = models.ForeignKey(Post, db_column="id_post") 
    term_type = models.CharField('Term Type', max_length=3, 
           default=CITES[0][0], choices=CITES) 

Здесь я хочу, чтобы выбрать только те типы сообщений, которые находятся в категории Java.

Таким образом, я делаю таким образом, но это бросает исключение:

Post.objects.filter(terms__name='Java', termrelation_set__term_type='CAT') 

Как SQL Ожидать:

SELECT ... FROM Post p 
LEFT OUTER JOIN TermRelation r ON p.id = r.id_post 
LEFT OUTER JOIN Term t ON t.id = r.id_term 
WHERE r.term_type = 'CAT' 
     AND t.name = 'Java'; 

Пожалуйста, помогите мне, что я должен делать ?

+2

Вместо 'termrelation_set__term_type', попробуйте' termrelation__term_type' –

+0

@Bibhas спасибо, 'termrelation__term_type' работ. Большое большое спасибо – vinaykrsharma

ответ

1

Вместо termrelation_set__term_type, попробуйте termrelation__term_type. Поняв намек от official documentation -

As you are using an intermediate model, you can also query on its attributes: 

# Find all the members of the Beatles that joined after 1 Jan 1961 
>>> Person.objects.filter(
...  group__name='The Beatles', 
...  membership__date_joined__gt=date(1961,1,1)) 
[<Person: Ringo Starr] 
Смежные вопросы