0

я использовал Writable Nested Serializer в моем serializer и использовал create метод, как это:Джанго Rest Framwork Writable Вложенные сериализаций

class OrderSerializer(serializers.ModelSerializer): 
    billing = BillingSerializer() 

    class Meta: 
     model = Order 
     fields = '__all__' 

    def create(self, validated_data): 
     billing_data = validated_data.pop('billing') 
     order = Order.objects.create(**validated_data) 
     Billing.objects.create(**billing_data) 
     return order 

Я могу создавать вложенные данные. но когда я получу вид, он будет выглядеть так:

{ 
     "id": 1, 
     "billing": {}, 
     "quantity": 3, 
     "delivery_date": "2017-01-27T15:44:40Z", 
     "base_rate": "90.00", 
     "is_delivered": false, 
     "created_at": "2017-01-26T07:26:53.194450Z", 
     "updated_at": "2017-01-26T07:26:53.194495Z", 
     "user_id": 1 
    } 

Пустой знак для выставления счета. Мои модели заключаются в следующем:

class Billing(models.Model): 
    paid_status = models.BooleanField(default=False) 
    total_billed = models.DecimalField(default=90.00, max_digits=6, decimal_places=2) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

    class Meta: 
     ordering = ('created_at',) 
     verbose_name = 'Billing' 
     verbose_name_plural = 'Billings' 

class Order(models.Model): 
    user_id = models.ForeignKey('auth.User', related_name='orders', on_delete=models.CASCADE) 
    quantity = models.PositiveIntegerField(validators=[MaxValueValidator(10)]) 
    delivery_date = models.DateTimeField(default=datetime.now()+timedelta(days=1)) 
    base_rate = models.DecimalField(default=90.00, max_digits=6, decimal_places=2) 
    is_delivered = models.BooleanField(default=False) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 
    billing = models.TextField() 

    class Meta: 
     ordering = ('created_at',) 
     verbose_name = 'Order' 
     verbose_name_plural = 'Orders' 

    def __str__(self): 
     return self.id 

Вот мой oderView:

class OrderViewSet(viewsets.ModelViewSet): 

    queryset = Order.objects.all() 
    serializer_class = OrderSerializer 
    permission_classes = (permissions.IsAuthenticated, permissions.IsAdminUser,) 

Как я могу получить ожидаемые данные?

+1

У вас есть поле 'billing' как TextField в определении модели, переопределите его с помощью ForeignKey. Это должно работать –

+0

billing = models.ForeignKey ('Billing')? – mimic

+0

IntegrityError at/api/orders/ (1048, «Столбец« billing_id »не может быть нулевым») – mimic

ответ

0

Эта проблема была решена с использованием счетов в ForeignKey: в order модель:

billing = models.ForeignKey(Billing, related_name='orders', on_delete=models.CASCADE) 

Как показано:

IntegrityError в/API/заказы/(1048, «Колонка«BILLING_ID 'не может быть null ")

Был решен мой изменяющийся метод создания в OrderSerializer:

def create(self, validated_data): 
    billing_data = validated_data.pop('billing') 
    billing = Billing.objects.create(**billing_data) 
    billing.save() 
    order = Order.objects.create(billing_id=billing.id, **validated_data) 
    return order