2016-08-04 3 views
0

Я новичок в 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. Новое местоположение создается и возвращается со всеми полями инициализированы, когда новый адрес виден для в первый раз
  2. Существующее место, которое соответствует «адрес» в базе данных возвращается вместо шага 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() устарел. Есть ли способ достичь того, что я ищу?

ответ

0

Ок, я понял ответ на свой вопрос. Я не уверен, что это лучшее решение; Однако, для тех, кто нуждается в решении, вот что я в конечном итоге делает:

class LocationCreateAPIView(CreateAPIView): 
    serializer_class = LocationCreateSerializer 
    queryset = Location.objects.all() 

    def post(self, request, format=None): 
     address = None 
     if 'address' in self.request.data: 
      address = self.request.data['address'] 
     else: 
      return Response(status=HTTP_400_BAD_REQUEST) 

     try: 
      location = Location.objects.get(address=address) 
      serializer = self.get_serializer(location) 
      return Response(serializer.data, status=HTTP_200_OK) 
     except Location.DoesNotExist: 
      pass 

     serializer = LocationCreateSerializer(data=self.request.data) 
     if serializer.is_valid(): 
      somevalue1, somevalue2 = Location.compute_things(self, address=address) 
      if (not somevalue1) | (not somevalue2): 
       return Response(status=HTTP_400_BAD_REQUEST) 

      serializer.save(address=address, thing1=somevalue1, thing2=somevalue2) 
      return Response(serializer.data, status=HTTP_201_CREATED) 

     return Response(status=HTTP_400_BAD_REQUEST) 

Если у вас есть лучшее решение, пожалуйста, напишите его. Я бы хотел продолжить обучение.

0

Вы пропустили одну вещь, то есть,

fields =("Here will be your models fields. That you want to serialize.") То есть после model = Location в сериализатором.

И вы можете следовать официальному документу о Django-REST-Framework

+0

Поля по умолчанию, когда «поля» не указаны, - это все поля. Это не решит проблему. – Sunny

Смежные вопросы