我试图弄清楚为什么当我提交表单时,我的标签没有保存在我的数据库中。 django-rest-framework 和 Django-taggit 也很新,我想我做错了什么:)
首先,在使用其余框架创建 API 之前,我使用通用视图(CreateView 和 UpdateView)来注册/验证我的事件。它工作正常,但我决定进一步尝试构建一个 API,因为我现在使用 Angularjs。
现在我的模型事件已创建,但没有我的标签,并且我有一些错误。我输入了一些代码,然后我将描述我的错误。
事件/模型.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)
[...]
我正在使用serializers.HyperlinkedModelSerializer。
api/序列化器.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_-]+)/$', EventDetailAPIView.as_view(), name='event-detail'),
所以首先当我打电话时/api/events/我的事件名称API 向我发送了带有我的标签的优质资源。 GET 方法工作正常。
我认为休息框架遵循查询集。那么,如果我可以获取带有所有标签的资源,为什么当我使用 POST 时我的标签没有注册?
实际上我对 POST 方法有两个问题:
- 第一个,如果我发送一个我已经创建的标签,他会向我发送一个错误,指出该标签必须是唯一的。我明白,我不想创建一个新的,我只是希望它与我的对象链接。当我使用通用视图时,我没有这个问题(这是通过魔术完成的:)并且一切正常)
- Secondly, when i try to create a new tag, my new event is saved but without my tags.
You can see the response received by angularjs for my tag... He send me the name of the tag but without id, url (hyperlinked). When i checked my db the tag has not been created.
我想我必须在我的tags_views中制作一个自定义的get_queryset(self),但我不确定。
我会继续调查。如果有人已经这样做并且有一些建议,我会非常API。谢谢。