2012-07-19 90 views
6

我有兩個模型通過多對多關係由另一個模型鏈接。Tastypie,過濾多對多關係

這裏的模型本身

class Posts(models.Model): 
    id = models.CharField(max_length=108, primary_key=True) 
    tags = models.ManyToManyField('Tags', through='PostTags') 


class Tags(models.Model): 
    id = models.CharField(max_length=108, primary_key=True) 
    posts = models.ManyToManyField('Posts', through='PostTags') 

class PostTags(models.Model): 
    id = models.CharField(max_length=108, primary_key=True) 
    deleted = models.IntegerField() 
    post_id = models.ForeignKey('Posts', db_column='post_field') 
    tag_id = models.ForeignKey('Tags', db_column='tag_field') 

而且tastypie資源

class PostsResource(ModelResource): 
    tags = fields.ToManyField('django_app.api.TagsResource', 'tags', null=True) 
    class Meta: 
     queryset = Posts.objects.filter(deleted=0) 
     resource_name = 'posts' 

class TagsResource(ModelResource): 
    posts = fields.ToManyField('django_app.api.PostsResource', 'posts', null=True) 
    class Meta: 
     queryset = Tags.objects.filter(deleted=0) 
     resource_name = 'tags' 

在posttags桌子上有一個刪除標誌,是否有可能只返回鏈接的結果時,在PostTags刪除標誌是0?

我試過this tastypie中的filter屬性,但它似乎只關心鏈接表(即標籤或帖子)中的標誌而不是實際的鏈接表。

+0

您是否嘗試過'查詢集= Posts.objects.filter(posttags__deleted = 0)'梅塔對於每個資源? – astevanovic 2012-07-19 12:24:33

+0

這很奇怪,那是一半的作品。就像我打印queryset.query一樣,它正在執行正確的SQL語句(就像它在delete = 0的地方那樣)。但通過api請求返回的結果似乎仍然忽略了該標誌。 – Shane 2012-07-19 13:54:41

回答

7

您可以使用顯示錶名稱和字段名稱的lambda包屬性過濾字段。

tags = fields.ToManyField('django_app.api.TagsResource', attribute=lambda bundle: bundle.obj.tags.filter(tags__deleted=0))
1

哇...我一直在尋找這一切! 「屬性」正是我所期待的。我幾乎開始對我的模型進行黑客攻擊,從絕望中進行篩選。

From the Resource Field documentation for ToManyField:

提供了通過一個連接表獲取相關數據。

該子類要求Django的ORM層正常工作。

該字段在處理 中的屬性時也有特殊行爲,因此可以調用該屬性。例如,如果您需要過濾 反向關係,你可以這樣做:

subjects = fields.ToManyField(SubjectResource, attribute=lambda bundle: Subject.objects.filter(notes=bundle.obj, name__startswith='Personal'))