Почему мой запрос django-taggit через модель/вкусный пирог приводит к сбою моего приложения?

Я относительно новичок в Django и действительно боролся с реализацией пользовательского приложения django-taggit через REST API. Я исследовал это и продолжаю сталкиваться с теми же проблемами. Я ценю любую помощь и рекомендации, которые вы можете предоставить.

У меня есть модель, в которую я пытаюсь добавить теги с помощью 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 с тегом, которого еще нет в таблице тегов, он будет зависать и вращаться вечно без ответа.

Извините, самый длинный вопрос, но, надеюсь, подробности помогут вам помочь мне. :) Спасибо еще раз!


person bevinlorenzo    schedule 03.08.2012    source источник
comment
Трудно сказать, не видя вашей реализации taggit, можете ли вы опубликовать модель тега?   -  person Dmitry Shevchenko    schedule 20.08.2012


Ответы (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)

Я быстро проверяю, существует ли тег, если нет, то быстро его создаю. Это работает и не ломается. Вы не видите проблем с этим?

person bevinlorenzo    schedule 22.08.2012