2

我对 Django 比较陌生,并且一直在努力通过 sweetpie REST API 实现自定义 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 表

但是,如果我使用不在标签表中的标签运行 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 回答