6

我有两个模型通过多对多关系由另一个模型链接。

这是模型本身

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')

和美味的资源

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 表中有一个deleted 标志,是否只能在PostTags 中的deleted 标志为0 时返回链接结果?

我已经在tastepie 中尝试过这个过滤器属性,但它似乎只关心链接表中的标志(即标签或帖子),而不是执行链接的实际表。

4

2 回答 2

8

您可以使用显示表名和字段名的 lambda 捆绑属性过滤字段。

tags = fields.ToManyField('django_app.api.TagsResource', attribute=lambda bundle: bundle.obj.tags.filter(tags__deleted=0))
于 2012-07-23T10:04:27.323 回答
1

哇...我一直在寻找这个!“属性”正是我想要的。出于绝望,我几乎开始对我的模型进行黑客攻击以进行过滤。

从 ToManyField 的资源字段文档中:

通过连接表提供对相关数据的访问。

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

这个字段在处理属性时也有特殊的行为,因为它可以接受一个可调用的。例如,如果您需要过滤反向关系,您可以执行以下操作:

subjects = fields.ToManyField(SubjectResource, attribute=lambda bundle: Subject.objects.filter(notes=bundle.obj, name__startswith='Personal'))
于 2014-08-17T23:07:41.073 回答