Я не могу создать связанные таблицы в django с помощью сериализаторов
Пожалуйста, помогите! Мне нужно создать базу данных акций postgresQL. Я использую команду в Visual Studio Code. Но у меня ошибка на строке "StockProduct.objects.create" в serializers.py. Склад создается в базе, но без продуктов на этом складе.
команда в Visual Studio Code:
###
# create a stock
POST {{baseUrl}}/stocks/
Content-Type: application/json
{
"address": " stock_ address ru3",
"positions": [{"product": 2, "quantity": 250, "price": 120.50},
{"product": 3, "quantity": 100, "price": 180}]
}
serializers.py
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ('title', 'description')
class ProductPositionSerializer(serializers.ModelSerializer):
class Meta:
model = StockProduct
fields = ('quantity', 'price')
class StockSerializer(serializers.ModelSerializer):
positions = ProductPositionSerializer(many=True)
#id = serializers.IntegerField()
# configure the serializer for the warehouse
class Meta:
model = Stock
fields = ('address', 'positions')
def create(self, validated_data):
positions = validated_data.pop('positions')
# create stock
stock = super().create(validated_data)
for position in positions:
StockProduct.objects.create(stock=stock, product_id=position['product'], price=position['price'], quantity=position['quantity'])# 1.Variant
#StockProduct.objects.create(stock=stock, **position) # 2. variant
# defaults = {'price'=position['price'], 'quantity'=position['quantity']})
#product=position['product'], price=position['price'], quantity=position['quantity'])
# StockProduct.objects.create(position) #position=position
# StockProduct.objects.create(stock('id'), position)
#StockProduct.objects.create(positions)
# quantity = position.pop('quantity')
# price= position.pop('price')
# StockProduct.objects.create(quantity=quantity, price=price)
return stock
вариант Ошибка
# 1 variant Error . line 36, in create StockProduct.objects.create(stock=stock, product_id=position['product'], price=position['price'], quantity=position['quantity']) KeyError: 'product'
# 2. variant: DETAIL: The error string contains (2, 250, 120.50, null, 13).
# 3. variant: DETAIL: The error string contains (1, 250, 120.50, null, null).
# 4. variant: django.db.utils.IntegrityError: ERROR: NULL value in "product_id" column of "logistic_stockproduct" relation violates NOT NULL restriction
models.py
class Product(models.Model):
title = models.CharField(max_length=60, unique=True)
description = models.TextField(null=True, blank=True)
class Stock(models.Model):
address = models.CharField(max_length=200, unique=True)
products = models.ManyToManyField(
Product,
through='StockProduct',
related_name='stocks',
)
class StockProduct(models.Model):
stock = models.ForeignKey(
Stock,
on_delete=models.CASCADE,
related_name='positions',
)
product = models.ForeignKey(
Product,
on_delete=models.CASCADE,
related_name='positions',
)
quantity = models.PositiveIntegerField(default=1)
price = models.DecimalField(
max_digits=18,
decimal_places=2,
validators=[MinValueValidator(0)],
)
Мне нужно было добавить поле 'product' в промежуточный сериализатор модели "ProductPositionSerializer"
fields = ('id', 'product', 'quantity', 'price')
class ProductPositionSerializer(serializers.ModelSerializer):
class Meta:
model = StockProduct
fields = ('id', 'product', 'quantity', 'price')
class StockSerializer(serializers.ModelSerializer):
positions = ProductPositionSerializer(many=True)
class Meta:
model = Stock
fields = ('id', 'address', 'positions')
def create(self, validated_data):
positions = validated_data.pop('positions')
stock = super().create(validated_data)
for position in positions:
StockProduct.objects.create(stock=stock, **position)