@epolyak

Django-restf-ramework, как правильно HTTP POST методом добавить данные для модели с ForeignKey?

Начал изучать djangorestframework - нужно написать АПИ к сайту. Официальный туториал прост и быстро пройден, далее ближе к реальности создал две простых связанных (один ко многим) модели:
class ModelA(models.Model):
     ...

class ModelB(models.Model):
    modela = models.ForeignKey(ModelA)
    ...


Сериализаторы к ним простые, как в туториале:
class ModelASerializater(serializaters.HyperLinkModelSerialzater):
     class Meta:
            model = ModelA
            fields = (...)

class ModelBSerializater(serializaters.HyperLinkModelSerialzater):
     class Meta:
            model = ModelB
            fields = (...)


REST апи для ModelA работает хорошо (кто бы сомневался), а вот для ModelB все намного хуже - его не возможно создать, только чтение. Проблема в том что нет возможности передать МодельА так же нет возможности передать modela_id.
Точнее возможность есть но он это поле проигнорирует так как он его не сериализует и не дает принудительно его сериализовать (ругается не хорошими словами). Перечитал всю офф документацию по Serializers, ViewSets и прочему, два дня тестировал, дебажил, переопределял различные методы Serializers, ViewSets, смотрел код проекта, но так и не нашел информаци как это сделать (((

Поделитесь опытом кто уже сталкивался с этой проблемой - какое есть решение или решения нет,
придется создавать промежуточную плоскую модель, а потом уже преобразовывать в нормальный вид. или остается только Flask? Но у меня уже рабочий проект на django и мне хотелось бы сделать все на одном стеке.

Спасибо.
  • Вопрос задан
  • 434 просмотра
Решения вопроса 3
un1t
@un1t
Попробуй использовать serializaters.ModelSerialzater
Ответ написан
@AndyKovv
Пиши через Views,
В сереалайзере В выдели поля толко для записи:
write_only_fields =(' .....', )
Передай реквест в view, валидируй данные
serializer = ModelBSerializater(data = request.data)
    if serializer.is_valid(raise_exception=True): # Валидируеш приходыне данные
          req_id = serializer.data['incoming_id']   #  Вытаскиваеш id  входных данных
          incoming_data = serializer.data['incom_data1']   #   Вытаскиваеш остальные данные
          ...............
       try:
          object = ModelA.objects.get(id =req_id ) #Находим обьект в модели А
      except ModelA.DoesNotExist:
           pass
     ModelB.objects.create(modela = object, , data_b = incoming_data)     #  Записывает данные в модель В
     return Response({'OK': 'Creasted'}, status=status.HTTP_201_CREATED) # Ответ

Пробуй. Если правильно понял вопрос.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы