Я пытаюсь понять, как работает сериализатор из django, когда у нас есть несколько полей из нескольких таблиц, и эти поля связаны с FK.
Моя цель - получить всю информацию за один Json.
Я создаю сценарий в этом посте,
Мои модели:
class operacoes(models.Model):
# Fields
date = models.DateTimeField()
class Meta:
ordering = ('-pk',)
def __unicode__(self):
return u'%s' % self.pk
def get_absolute_url(self):
return reverse('sales_operacoes_detail', args=(self.pk,))
def get_update_url(self):
return reverse('sales_operacoes_update', args=(self.pk,))
class type(models.Model):
# Fields
name = models.CharField(max_length=255)
description = models.TextField(max_length=100)
# Relationship Fields
venda_operacoes = models.ForeignKey(
'sales.operacoes',
on_delete=models.CASCADE, related_name="types",
)
class Meta:
ordering = ('-pk',)
def __unicode__(self):
return u'%s' % self.pk
def get_absolute_url(self):
return reverse('sales_type_detail', args=(self.pk,))
def get_update_url(self):
return reverse('sales_type_update', args=(self.pk,))
class car(models.Model):
# Fields
name = models.CharField(max_length=255)
# Relationship Fields
car_type_relate = models.OneToOneField(
'sales.type',
on_delete=models.CASCADE, related_name="cars",
)
class Meta:
ordering = ('-pk',)
def __unicode__(self):
return u'%s' % self.pk
def get_absolute_url(self):
return reverse('sales_car_detail', args=(self.pk,))
def get_update_url(self):
return reverse('sales_car_update', args=(self.pk,))
class source_car(models.Model):
# Fields
name = models.CharField(max_length=255)
brand = models.TextField(max_length=100)
price = models.TextField(max_length=100)
# Relationship Fields
source_car_car = models.OneToOneField(
'sales.car',
on_delete=models.CASCADE, related_name="source_cars",
)
class Meta:
ordering = ('-pk',)
def __unicode__(self):
return u'%s' % self.pk
def get_absolute_url(self):
return reverse('sales_source_car_detail', args=(self.pk,))
def get_update_url(self):
return reverse('sales_source_car_update', args=(self.pk,))
class bike(models.Model):
# Fields
name = models.CharField(max_length=255)
# Relationship Fields
bike_sales_related = models.OneToOneField(
'sales.type',
on_delete=models.CASCADE, related_name="bikes",
)
class Meta:
ordering = ('-pk',)
def __unicode__(self):
return u'%s' % self.pk
def get_absolute_url(self):
return reverse('sales_bike_detail', args=(self.pk,))
def get_update_url(self):
return reverse('sales_bike_update', args=(self.pk,))
class source_bike(models.Model):
# Fields
name = models.CharField(max_length=255)
brand = models.TextField(max_length=100)
price = models.TextField(max_length=100)
class Meta:
ordering = ('-pk',)
def __unicode__(self):
return u'%s' % self.pk
def get_absolute_url(self):
return reverse('sales_source_bike_detail', args=(self.pk,))
def get_update_url(self):
return reverse('sales_source_bike_update', args=(self.pk,))
I Создаю конечную точку для моделей: То есть получаем одну за одну:
from . import models
из rest_framework import serializer
class operacoesSerializer(serializers.ModelSerializer):
class Meta:
model = models.operacoes
fields = (
'pk',
'date',
)
class typeSerializer(serializers.ModelSerializer):
class Meta:
model = models.type
fields = (
'pk',
'name',
'description',
)
class carSerializer(serializers.ModelSerializer):
class Meta:
model = models.car
fields = (
'pk',
'name',
)
class source_carSerializer(serializers.ModelSerializer):
class Meta:
model = models.source_car
fields = (
'pk',
'name',
'brand',
'price',
)
class bikeSerializer(serializers.ModelSerializer):
class Meta:
model = models.bike
fields = (
'pk',
'name',
)
class source_bikeSerializer(serializers.ModelSerializer):
class Meta:
model = models.source_bike
fields = (
'pk',
'name',
'brand',
'price',
)
Теперь мне нужно создать конечную точку, способную выполнять объединение всех таблиц и извлекать данные, я много думал, но безуспешно.
Мой ожидаемый Json, например, выглядит примерно так:
[
{
"id": 1,
"date": "2020-01-10",
"type": [
{
"id": 1,
"operacao_id": 1
"car": [
{
"id": 2
"type_id": 1
"name": "Ferrari"
"Source_car_id": [
{
name: "Ferrari LXT 678"
price: "U$ 80000000,00"
}
]
}
]
}
]
},
{
"id": 2,
"date": "2020-01-11",
"type": [
{
"id": 1,
"operacao_id": 2
"car": [
{
"id": 12
"type_id": 1
"name": "Fusca"
"Source_car_id": [
{
name: "Fusca 1600"
price: "U$ 4000,00"
}
]
}
]
},
{
"id": 3,
"operacao_id": 2
"bike": [
{
"id": 12
"type_id": 3
"name": "Bike Harley"
"Source_bike_id": [
{
name: "Bike Harley lc409"
price: "U$ 44000,00"
}
]
}
]
}
]
},
{
"id": 3,
"date": "2020-01-10",
"type": [
{
"id": 1,
"operacao_id": 3
"car": [
{
"id": 2
"type_id": 1
"name": "Ferrari"
"Source_car_id": [
{
name: "Kombi Volks 1234"
price: "U$ 85000000,00"
}
]
}
]
}
]
},
Как соединение, связывающее все таблицы.
Какой лучший способ сделать конечную точку для получения этих данных?
Спасибо!