为什么我的django-taggit通过模型/ tastypie查询崩溃我的应用程序?

时间:2012-08-03 05:36:43

标签: django tastypie django-taggit

我对Django相对较新,并且通过tastypie REST API真正在努力实现自定义django-taggit应用程序。我已经研究过这个并且继续遇到同样的问题。我感谢您提供的任何帮助和指导。

我有一个模型,我正在尝试使用django-taggit添加标签。我需要为每个标记添加一个user_id,以便每个用户拥有自己的标记列表。出于这个原因,我设置了Through Model as shown here。以下是我的模型的设置方法:

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)

现在。这适用于两种情况:

  1. 使用标记过滤器为查询运行GET查询。
  2. 运行PUT查询以将EXISTING标记添加到TaggedMedia表
  3. 但是,如果我使用不在Tags表中的Tag运行PUT查询,它将挂起并永久旋转而没有响应。

    对不起,有史以来最长的问题,但希望细节可以帮助你帮助我。 :) 再次感谢!

1 个答案:

答案 0 :(得分: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)

我快速检查标签是否存在,如果不存在,我会快速创建。这有效并且不会崩溃。你看到这样做有什么问题吗?