Вложенные сериализаторы Django с внешним полемPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Вложенные сериализаторы Django с внешним полем

Сообщение Anonymous »

Я пытаюсь отправить этот json-запрос через почтальона

Код: Выделить всё

{   "name":"Someones order",
"date_due": "2024-06-23T15:52:59Z",
"customer":3,
"orderItem":[{
"item":1,
"count":1
}]
}
Я реализовал свои модели следующим образом.

Код: Выделить всё

       class Item(models.Model):
name = models.CharField(max_length=255)
price = models.DecimalField(max_digits=6, decimal_places=2)
bakery = models.ForeignKey(Bakery,on_delete=models.CASCADE,related_name='items')

def __str__(self):
return f'{self.name}'

class Order(models.Model):

name = models.CharField(max_length=255)
bakery = models.ForeignKey(Bakery,on_delete=models.CASCADE,related_name='orders')
customer = models.ForeignKey(Customer,on_delete=models.CASCADE,related_name='orders')
date_created= models.DateTimeField(auto_now_add=True)
date_due = models.DateTimeField()
date_updated = models.DateTimeField(auto_now=True)
#order_item = models.OneToOneField(OrderItem, on_delete=models.CASCADE,related_name='item_orderitems')
def __str__(self):
return f'{self.name}'

class OrderItem(models.Model):
bakery = models.ForeignKey(Bakery,on_delete=models.CASCADE,related_name='order_items')
count = models.IntegerField()
item = models.ForeignKey(Item, on_delete=models.CASCADE,related_name='item_orderitems')
order = models.OneToOneField(Order, on_delete=models.CASCADE,related_name='orderitems')
def __str__(self):
return f'{self.name}'
Сериализатор реализован как

Код: Выделить всё

class OrderItemCreateSerializer(serializers.ModelSerializer):
class Meta:
model = OrderItem
fields = ['item','count']

class OrderCreateSerializer(serializers.ModelSerializer):

orderItem=OrderItemCreateSerializer(many=True)
class Meta:
model = Order
fields = ("name","date_due","customer","orderItem")

def create(self, validated_data):
print("create")
print(validated_data)
itemid=validated_data.pop("orderItem")
print(itemid)
bakery=self.context['request'].user.bakery
customer=validated_data.pop("customer")

print(customer)
print("validated_data")
print(validated_data)
order=Order.objects.create(bakery=bakery,customer=customer,**validated_data)
print("create 4")
for items in itemid:
print("create 5")
OrderItem.objects.create(bakery=bakery,order=order,**items)
print("create 6")
print("returning")
return order

Когда я делаю запрос на публикацию, я получаю
Получена ошибка AttributeError при попытке получить значение для поля orderItem в сериализаторе OrderCreateSerializer
code>.
Поле сериализатора могло быть названо неправильно и не соответствовать какому-либо атрибуту или ключу в экземпляре Order.
Исходный текст исключения был следующим: Объект «Order» не имеет атрибута «orderItem».
Я понимаю, что в модели Order нет поля, указывающего на элемент заказа, но связь скорее обратная. Но OrderCreateSerializer отображает orderItem как поле.
Я реализовал то же самое с обычным сериализатором вместо Modelserializer, думая, что, возможно, он жалуется, поскольку на самом деле он не является частью модели.
Но самое главное: если вы посмотрите на мои операторы печати, он выводит «возврат» и возвращает результат.
Должен ли я реализовать метод create набора modelviewset и реализовать там какую-то логику? это поможет?

Подробнее здесь: https://stackoverflow.com/questions/787 ... eign-field
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»