2

私は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つのシナリオに最適です。

  1. タグフィルターを使用したクエリに対してGETクエリを実行します。
  2. PUTクエリを実行して、既存のタグをTaggedMediaテーブルに追加します

ただし、Tagsテーブルにまだ存在しないタグを使用してPUTクエリを実行すると、ハングして永久にスピンし、応答がありません。

申し訳ありませんが、これまでで最も長い質問ですが、詳細がお役に立てば幸いです。:) 再度、感謝します!

4

1 に答える 1

1

これは最適ではないと確信していますが、これは機能しているようです。

def save_m2m(self, bundle):
    usrObj = User.objects.get(username=bundle.request.GET['username'])
    tags = bundle.data.get('tags', [])
    print tags

    for tag in tags:
        #check if the tag already exists for that user, if not save it in the DB before we try to reference it with m2m
        try:
            tagCheck = Tags.objects.get(user_id=usrObj.id,name=tag)
        except Tags.DoesNotExist:
            tagCheck = None
        if tagCheck is None:
            t1 = Tags(name=tag, user_id=usrObj.id)
            t1.save()
    #create relationships between tags and media        
    bundle.obj.tags.set(*tags)
    return super(MediaResource, self).save_m2m(bundle)

タグが存在するかどうかをすばやく確認し、存在しない場合はすばやく作成します。これは機能し、クラッシュしません。これを行うことに問題がありますか?

于 2012-08-22T05:20:24.940 に答える