私はDjangoに比較的慣れておらず、おいしいRESTAPIを介したカスタムdjango-taggitアプリの実装に本当に苦労しています。私はこれを調査し、同じ問題にぶつかり続けています。私はあなたが提供できるどんな助けと指導にも感謝します。
django-taggitでタグを追加しようとしているモデルがあります。各ユーザーが独自のタグのリストを所有できるように、各タグにuser_idを追加する必要がありました。このため、ここに示すようにスルーモデルを設定します。モデルの設定方法は次のとおりです。
class Tags(TagBase):
user = models.ForeignKey('UserProfile')
class TaggedMedia(GenericTaggedItemBase):
tag = models.ForeignKey(Tags, related_name="tagged_items")
class Media(models.Model):
user = models.ForeignKey('UserProfile')
# All Other Media Fields
tags = TaggableManager(through=TaggedMedia)
これにより、データベーステーブルが思ったとおりに設定されるので、正しい方向に進んでいるように感じます。
さて、TastyPieを介してこれらのモデルにアクセスしようとすると、ここで問題が発生します。私のモデルリソースは次のように設定されています。
class TaggedResource(ModelResource):
tags = ListField()
user = fields.ForeignKey(UserProfileResource, 'user')
class Meta:
queryset = Media.objects.all().order_by('-timestamp').distinct()
authorization = MediaAuthorization()
detail_allowed_methods = ['get', 'post', 'put', 'delete','patch']
def build_filters(self, filters=None):
if filters is None:
filters = {}
orm_filters = super(TaggedResource, self).build_filters(filters)
if 'tag' in filters:
orm_filters['tags__name__in'] = filters['tag'].split(',')
return orm_filters
def dehydrate_tags(self, bundle):
return map(str, bundle.obj.tags.all())
def save_m2m(self, bundle):
tags = bundle.data.get('tags', [])
bundle.obj.tags.set(*tags)
return super(TaggedResource, self).save_m2m(bundle)
今。これは、次の2つのシナリオに最適です。
- タグフィルターを使用したクエリに対してGETクエリを実行します。
- PUTクエリを実行して、既存のタグをTaggedMediaテーブルに追加します
ただし、Tagsテーブルにまだ存在しないタグを使用してPUTクエリを実行すると、ハングして永久にスピンし、応答がありません。
申し訳ありませんが、これまでで最も長い質問ですが、詳細がお役に立てば幸いです。:) 再度、感謝します!