Проблема с загрузкой связанных данных в сериализаторе REST Framework
в Django REST API проекте имеются две модели: "Тип поставки" и "Процессор".
class SupplyType(models.Model):
title = models.CharField(max_length=10)
slug = models.SlugField(max_length=100, unique=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('supply_type_detail', kwargs={'slug': self.slug})
class Processor(Product):
supply_type = models.ForeignKey(to=SupplyType, on_delete=models.PROTECT, related_name='processor')
cores_amount = models.IntegerField()
threads_amount = models.IntegerField()
technological_process = models.IntegerField()
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('processor_detail', kwargs={'slug': self.slug})
Под них были написаны соответствующие сериализаторы:
class SupplyTypeSerializer(ModelSerializer):
class Meta:
model = SupplyType
fields = ('id', 'title', 'slug')
class ProcessorSerializer(ModelSerializer):
supply_type = SupplyTypeSerializer(read_only=True)
class Meta:
model = Processor
fields = '__all__'
При помощи созданных методов API удается успешно создать тип поставки, например, "OEM", однако, при попытке добавить процессор, указав в поле "supply_type" значение 1 (id добавленной поставки) возникает ошибка:
django.db.utils.IntegrityError: null value in column "supply_type_id" of relation "store_processor" violates not-null constraint
DETAIL: Failing row contains (2, 2, 4, 14, null).
Содержание ошибки мне понятно, однако почему оно null - в упор не понимаю.
В конечном счете имеются следующие вопросы: как это исправить и как в таком случае добавить процессор с нужным типом поставки через API (все так же через id) или каким-либо другим образом?
По итогу при запросе хотелось бы получить что-то в таком роде:
{
"id": 1,
"title": "Intel Pentium Gold G6400",
"slug": "intel-pentium-gold-g6400",
"price": 19690,
"is_published" : true,
"cores_amount": 2,
"threads_amount": 4,
"technological_process": 14,
"supply_type":
{
"id": 1,
"title": "OEM",
"slug": "oem"
}
}