6

多対多の関係を介して別のモデルによってリンクされている2つのモデルがあります。

これがモデル自体です

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テーブルに削除済みフラグがありますが、PostTagsの削除済みフラグが0の場合にのみ、リンクされた結果を返すことはできますか?

私はこのフィルター属性をtastypieで試しましたが、リンクを実行している実際のテーブルではなく、リンクされたテーブル(つまりタグまたは投稿)のフラグのみを考慮しているようです。

4

2 に答える 2

8

テーブル名とフィールド名を示すラムダバンドル属性を使用してフィールドをフィルタリングできます。

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 に答える