Tastypie,过滤多对多关系(Tastypie, filtering many to many

2019-07-30 11:56发布

我有两个由另一个模型通过挂很多很多的关系模型。

这里的模型本身

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?

我已经试过这在tastypie过滤器属性,但它似乎只关心链接表(即标签或岗位)不实际的表做链接的标志。

Answer 1:

您可以使用筛选出表名和字段名拉姆达束属性字段。

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


Answer 2:

哇......我一直在寻找一整天为这个! 在“属性”正是我一直在寻找。 我几乎开始在我的模型黑客做筛选出有绝望。

从ToManyField资源领域的文档:

通过提供一个连接表获取相关数据。

这个子类需要Django的ORM层才能正常工作。

用它可以采取调用属性时,这领域也有特殊的行为。 例如,如果您需要过滤的反向关系,你可以这样做:

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


文章来源: Tastypie, filtering many to many relationships