Usando o Django-taggit com o django-rest-framework, não consigo salvar minhas tags
Estou tentando descobrir por que, quando eu envio meu formulário, minhas tags não são salvas no meu banco de dados. Muito novo com o django-rest-framework e o Django-taggit também, acho que estou fazendo algo errado :)
Primeiro, antes de criar minha API com o resto da estrutura, eu estava usando uma exibição genérica (CreateView e UpdateView) para registrar / validar meu evento. Estava funcionando bem, mas decidi ir além e tentar criar uma API, pois agora estou usando o Angularjs.
Agora, meu evento de modelo é criado, mas sem minha tag e tenho alguns erros. Coloquei algum código e descreverei meus erros depois.
events / models.py
class Event(models.Model):
[...]
title = models.CharField(max_length=245, blank=False)
description = models.TextField(max_length=750, null=True, blank=True)
start = models.DateTimeField()
end = models.DateTimeField()
created_at = models.DateTimeField(editable=False)
updated_at = models.DateTimeField(editable=False)
slug = AutoSlugField(populate_from='title', unique=True, editable=False)
expert = models.BooleanField(choices=MODE_EXPERT, default=0)
home = models.BooleanField(choices=HOME, default=0)
nb_participant = models.PositiveSmallIntegerField(default=1)
price = models.PositiveSmallIntegerField(default=0)
cancelled = models.BooleanField(default=0)
user = models.ForeignKey(User, editable=False, related_name='author')
address = models.ForeignKey('Address', editable=False, related_name='events')
participants = models.ManyToManyField(User, related_name='participants', blank=True, editable=False,
through='Participants')
theme_category = models.ForeignKey('EventThemeCategory', unique=True, editable=False)
tags = TaggableManager(blank=True)
class Meta:
db_table = 'event'
def save(self, *args, **kwargs):
if not self.pk:
self.created_at = timezone.now()
self.updated_at = timezone.now()
super(Event, self).save(*args, **kwargs)
[...]
Estou usando o serializers.HyperlinkedModelSerializer.
api / serializer.py
from taggit.models import Tag
class TagListSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Tag
fields = ('url', 'id', 'name')
class EventSerializer(serializers.HyperlinkedModelSerializer):
address = AddressSerializer()
user = UserSerializer(required=False)
tags = TagListSerializer(blank=True)
class Meta:
model = Event
fields = ('url', 'id', 'title', 'description', 'start', 'end', 'created_at', 'updated_at', 'slug', 'expert','home', 'nb_participant', 'price', 'address', 'user', 'theme_category', 'tags')
depth = 1
api / views / tags_views.py
from rest_framework import generics
from api.serializers import TagListSerializer
from taggit.models import Tag
class TagsListAPIView(generics.ListCreateAPIView):
queryset = Tag.objects.all()
model = Tag
serializer_class = TagListSerializer
class TagsDetailAPIView(generics.RetrieveUpdateDestroyAPIView):
queryset = Tag.objects.all()
model = Tag
serializer_class = TagListSerializer
api / views / events_views.py
class EventListAPIView(generics.ListCreateAPIView):
queryset = Event.objects.all()
model = Event
serializer_class = EventSerializer
paginate_by = 100
def pre_save(self, obj):
"""
Set the object's owner, based on the incoming request.
"""
obj.user = self.request.user
return super(EventListAPIView, self).pre_save(obj)
api / urls.py
url(r'^events/(?P<slug>[0-9a-zA-Z_-]+)/Então, primeiro quando eu ligo/ api / events / nome-do-meu-evento a API me envia o bom recurso com minhas tags. O método GET está funcionando bem.
Eu estava pensando que o resto-framework segue o conjunto de consultas. Portanto, se eu posso obter o recurso com todas as minhas tags, por que, quando eu uso o POST, minhas tags não são registradas?
Na verdade, eu tenho dois problemas com o método POST:
primeiro, se eu enviar uma tag que eu já criei, ele me enviará um erro dizendo que a tag deve ser única. Entendo que não quero criar um novo, apenas quero que ele esteja vinculado ao meu objeto. Não tenho esse problema ao usar a exibição genérica (é feita por mágica :) e tudo está funcionando bem)Em segundo lugar, quando tento criar uma nova tag, meu novo evento é salvo, mas sem minhas tags. Você pode ver a resposta recebida por angularjs para minha tag ... Ele me enviou o nome da tag, mas sem id, url (hiperlink). Quando verifiquei meu banco de dados, a tag não foi criada.Eu acho que tenho que fazer um get_queryset personalizado (self) em minhas tags_views, mas não tenho certeza. Vou continuar a investigar. Se alguém já fez isso e tem alguns conselhos, eu serei muito API. Obrigado.
, EventDetailAPIView.as_view(), name='event-detail'),
Então, primeiro quando eu ligo/ api / events / nome-do-meu-evento a API me envia o bom recurso com minhas tags. O método GET está funcionando bem.
Eu estava pensando que o resto-framework segue o conjunto de consultas. Portanto, se eu posso obter o recurso com todas as minhas tags, por que, quando eu uso o POST, minhas tags não são registradas?
Na verdade, eu tenho dois problemas com o método POST:
primeiro, se eu enviar uma tag que eu já criei, ele me enviará um erro dizendo que a tag deve ser única. Entendo que não quero criar um novo, apenas quero que ele esteja vinculado ao meu objeto. Não tenho esse problema ao usar a exibição genérica (é feita por mágica :) e tudo está funcionando bem)Em segundo lugar, quando tento criar uma nova tag, meu novo evento é salvo, mas sem minhas tags. Você pode ver a resposta recebida por angularjs para minha tag ... Ele me enviou o nome da tag, mas sem id, url (hiperlink). Quando verifiquei meu banco de dados, a tag não foi criada.Eu acho que tenho que fazer um get_queryset personalizado (self) em minhas tags_views, mas não tenho certeza. Vou continuar a investigar. Se alguém já fez isso e tem alguns conselhos, eu serei muito API. Obrigado.