2014-01-18 88 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]