Ваша реализация create(self, request, *args, **kwargs)
ничего не сделает, потому что функция пуста, она даже не вернет ответ.
У вас нетположить что-нибудь в create
, list
, retrieve
, update
, partial_update
и destroy
, потому что вы используете класс ModelViewSet
.ModelViewSet
обеспечивает реализацию по умолчанию для всех из них.Если вы действительно хотите сохранить свои переопределения, хотя вы можете использовать эту реализацию вместо этого:
def create(self, request, *args, **kwargs):
"""You could add some documentation here"""
return super().create(request, *args, **kwargs)
Мы используем super()
, потому что он вызывает родительскую реализацию create
.
То, что вы делаете правильно, позвольте мне добавить, что я бы лично поставил
unique=True
в поле модели, а не добавлял валидатор в сериализатор.Rest Framework достаточно умен, чтобы сериализатор проверил поле модели и автоматически добавил уникальную проверку.Если вы предпочитаете избегать уникального индекса в вашей базе данных, то, я думаю, вы используете
UniqueValidator
правильно.
BISBN = models.CharField(db_column='BISBN', max_length=10, default=None, unique=True)
Имейте в виду, что вы можете быть восприимчивымигонять условия без уникального индекса в базе данных.Под этим я подразумеваю, что две книги могут быть созданы / обновлены, чтобы иметь одинаковый isbn, если эти операции выполняются одновременно.
Опять же, я бы применил проверку для нескольких полей в модели с использованием атрибута
Meta.unique_together
модели, то есть
class Book(models.Model):
# fields...
class Meta:
unique_together = ("BNAME", "BISBN")
Однако, если вы не хотите, чтобы уникальный индекс на вашембаза данных для этого, то вы используете UniqueTogetherValidator
правильно.
У меня есть еще один лакомый кусочек, который, я думаю, стоит упомянуть:
По вашему мнению, должны работать lookup_url_kwarg
и lookup_field
с isbn в ваших определениях URL.
class BookViewSet(ModelViewSet):
lookup_url_kwarg = "isbn" # Use the 'isbn' from your url definition
lookup_field = "BISBN" # Use the `BISBN` field on your database/model to perform the lookups
# ...
Если вы хотите обрабатывать несколько URL-адресов, вам нужно будет настроить метод get_queryset()
.В следующем коде я использую isbn
, чтобы отфильтровать набор запросов, а затем разрешить представлению искать книгу по имени.
class BookViewSet(ModelViewSet):
lookup_url_kwarg = "name"
lookup_field = "BNAME"
def get_queryset(self):
# self.kwargs is a dictionary containing your url kwargs.
isbn = self.kwargs.get("isbn")
book_queryset = super().get_queryset()
return book_queryset.filter(BISBN=isbn)