我对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)
现在。这适用于两种情况:
但是,如果我使用不在Tags表中的Tag运行PUT查询,它将挂起并永久旋转而没有响应。
对不起,有史以来最长的问题,但希望细节可以帮助你帮助我。 :) 再次感谢!
答案 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)
我快速检查标签是否存在,如果不存在,我会快速创建。这有效并且不会崩溃。你看到这样做有什么问题吗?