Я новичок в Django. Чтение множества способов сделать то же самое - но не найти иглу пословиц в стоге сена. Одна из таких игл представляет собой простой шаблон «Найти или создать» для Django Rest.Django Rest ModelSerializer Найти или создать шаблон
Я пытаюсь найти простой пример того, как реализовать реализацию поиска или создать шаблон для одной из моих данных модели, используя методы Django Rest ModelSerializer и CreateAPIView. Скажем, у меня есть модель Location с уникальным полем «адрес». Я хочу вернуть существующий экземпляр, когда адрес уже существует в моей базе данных. Если адрес не существует, я хочу создать запись в базе данных и заполнить другие рассчитанные значения для объекта.
class Location(models.Model):
address = models.CharField(max_length=100, unique=True,)
thing1 = models.CharField(max_length=100, blank=True, null=True,)
thing2 = models.CharField(max_length=100, blank=True, null=True,)
def compute_things(self, address):
somevalue1 = ...
somevalue2 = ....
return somevalue1, somevalue2
Теперь, я точно не знаю, как писать сериалайзер и вид так, чтобы:
- Новое местоположение создается и возвращается со всеми полями инициализированы, когда новый адрес виден для в первый раз
- Существующее место, которое соответствует «адрес» в базе данных возвращается вместо шага 1
Что еще я должен определить для модели? Как написать APIView и CreateSerializer, чтобы получить правильное решение? Где я должен вызвать compute_thing(), чтобы заполнить недостающие поля.
Для сериализатором:
class LocationCreateSerializer(ModelSerializer):
class Meta:
model = Location
И для APIView:
class LocationCreateAPIView(CreateAPIView):
serializer_class = LocationCreateSerializer
queryset = Location.objects.all()
APIView и Serializer выше, не достаточно для того, что мне нужно. Что еще мне нужно добавить к модели, View и Serializer, чтобы получить то поведение, которое я ищу?
Я не хочу, чтобы View и Serializer возвращали ошибки проверки для повторяющихся «адресов» - только существующий экземпляр, а не ошибку. Похоже, что restore_object() устарел. Есть ли способ достичь того, что я ищу?
Поля по умолчанию, когда «поля» не указаны, - это все поля. Это не решит проблему. – Sunny