2016-11-13 6 views
0

Ich habe zwei Modelledjango Rest Rahmenmodell Fremdschlüssel

class Order(models.Model): 
    fields... 

class OrderItem(models.Model): 
    fiels... 
    order = models.ForeignKey(Order, related_name='items') 

und ich habe zwei Serializer:

class CreateOrderItemSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = OrderItem 
     resource_name = 'order-item' 
     fields = ('order', 'count') 
    ..... 
class OrderSerializer(serializers.ModelSerializer): 
    items = CreateOrderItemSerializer(many=True) 
    class Meta: 
     model = Order 
     resource_name = 'order' 
     fields = ('id','items') 

ich um wie dies mit Artikel Array geschrieben:

{ 
    'ordername': 'foo', 
    'items': [{ 
     'name': 'foo1', 
     },{ 
     'name': 'foo2', 
     }, 
     ] 
} 

Aber Ich habe einen Fehler:

"order":["This field is required."] 

Wie kann ich zuerst Bestellung erstellen später Artikel mit dieser Bestell-ID erstellen?

Antwort

0

meine eigene Antwort auf Frage: erste extra_kwargs Punkt Serializer hinzufügen:

class CreateOrderItemSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = OrderItem 
     resource_name = 'order-item' 
     fields = ('order', 'count') 
     extra_kwargs = { 
      'order': {'required': False}, 
     } 

nach Add-Methode erstellen, um orderserializer:

def create(self, validated_data): 
    items_data = validated_data.pop('items') 
    order = Order.objects.create(**validated_data) 
    for item in items_data: 
     item_name = item['name'] 
     item, created = OrderItem.objects.get_or_create(order=order,name=item_name) 
    return order 
0

Es ist eine gute Lösung hier Django Rest Framework writable nested serializers , die dies fast das gleiche Problem hier.

Der Unterschied ist hier ForeignKey statt ManyToMany verwendet, die required field error

Zugabe extra_kwargs löste dieses Problem verursachen wird, gibt es eine andere Art und Weise, die hinzuzufügen ist null = True zu foreignkey Feld

order = models.ForeignKey(Order, related_name='items', null=True) 
Verwandte Themen