2016-12-06 3 views
0

У меня есть две модели, одна указывает на другую модель.Django REST: Создание записей db в связанной таблице в одном POST

class ModelA(models.Model): 
    field1 = models.CharField() 
    field2 = models.CharField() 

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

Я использую Django REST для обработки данных. Я пытаюсь вставить данные в ModelA и ModelB, используя один вызов ajax. За одну запись в ModelA у меня есть список записей в ModelB. Так что мой Аякса данные,

ajax_data = {modela: {....}, modelb: [{...}, {...}, ...]} 

Когда я использую только одна модель, я могу спасти, в противном случае я не являюсь. Можно ли сохранить две связанные модели в одном запросе POST?

+0

Вы используете Джанго остальное модель сериалайзер? –

+0

да .. я использую ModelSerializer –

ответ

0

Да. Я собираюсь use the non-accepted answer from this question.

The Django docs state что вам нужно сохранить зависимую модель (А, в вашем случае), прежде чем вы можете сохранить соответствующую модель (B, в вашем случае.)

Note that you must save an object before it can be assigned to a foreign key relationship. For example, creating an Article with unsaved Reporter raises ValueError:

>>> r3 = Reporter(first_name='John', last_name='Smith', email='[email protected]') 
>>> Article.objects.create(headline="This is a test", pub_date=date(2005, 7, 27), reporter=r3) 
Traceback (most recent call last): 
... 
ValueError: save() prohibited to prevent data loss due to unsaved related object 'reporter'. 

Как другой ответ говорит - вы можете сделать это в двух POST или обработать его в представлении. Трудно дать специфику, не видя ваш код вида, но the DRF docs have this covered.

Я адаптировал код Роберта для использования здесь. Если бы это был приемлемый ответ, я бы просто связал его как дубликат.

class ASerializer(serializers.ModelSerializer):       
    class Meta: 
     model = ModelA 
     fields = ('field1', 'field1') 


class BSerializer(serializers.ModelSerializer): 
    bclass = ASerializer() 
    class Meta: 
     model = ModelB 
     fields = ('field1', 'field2', 'etc') 

views.py

import generics 

class BCreateAPIView(generics.CreateAPIView): 
    model = ModelB 
    serializer_class = BSerializer 
+1

Это решение :) –