2012-07-19 88 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'))