フォームを送信すると、タグがデータベースに保存されない理由を理解しようとしています。django-rest-framework と Django-taggit もかなり新しく、私は何か間違ったことをしていると思います:)
まず、残りのフレームワークで API を作成する前に、汎用ビュー (CreateView および UpdateView) を使用してイベントを登録/検証していました。正常に動作していましたが、Angularjs を使用しているため、さらに進んで API を構築することにしました。
これで、モデル イベントが作成されましたが、タグがなく、いくつかのエラーがあります。私はいくつかのコードを入れて、後でエラーについて説明します。
イベント/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)
[...]
私は 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/ビュー/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/ビュー/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/name-of-my-event を呼び出すと、API がタグ付きの適切なリソースを送信してくれます。GET メソッドは正常に動作しています。
rest-framework はクエリセットに従うと考えていました。すべてのタグでリソースを取得できる場合、POST を使用するとタグが登録されないのはなぜですか?
実際、POST メソッドには 2 つの問題があります。
- 最初に、すでに作成したタグを送信すると、タグは一意でなければならないというエラーが送信されます。新しいものを作成するのではなく、オブジェクトとリンクさせたいだけであることは理解しています。汎用ビューを使用する場合、この問題は発生しません (魔法によって行われます:)、すべて正常に動作しています)
- 次に、新しいタグを作成しようとすると、新しいイベントは保存されますが、タグがありません。私のタグに対してangularjsが受け取った応答を見ることができます...彼は私にタグの名前を送りますが、ID、URL(ハイパーリンク)はありません。データベースを確認したところ、タグが作成されていませんでした。
tags_views でカスタム get_queryset(self) を作成する必要があると思いますが、よくわかりません。引き続き調査していきます。誰かがすでにそれを行っていて、アドバイスがあれば、私は非常にAPIになります。ありがとう。