python - 当字段来自许多表 FK 时,Django 序列化程序出现问题
问题描述
ia newi 试图了解当我们有来自多个表的多个字段时,来自 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,))
我为模型创建了一个端点:那是一对一的检索:
from . import models
从 rest_framework 导入序列化程序
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',
)
现在我需要创建一个端点,能够像在所有表中加入并检索数据一样,我尝试了很多想法,但没有成功。
例如,我的 Expected 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"
}
]
}
]
}
]
},
就像关联所有表的连接一样。
端点检索这些数据的最佳方法是什么?
谢谢你!
解决方案
您不需要为每个模型定义序列化程序,而是可以使用depth
属性通过 django rest 框架来序列化嵌套对象,如下所示:
class operacoesSerializer(serializers.ModelSerializer):
class Meta:
model = models.operacoes
fields = (
'pk',
'date',
'types',
)
depth = 3
这将生成具有 3 级嵌套的嵌套对象。
推荐阅读
- c# - 如何将超过 2 个值传递到 SelectList (DropdownList)
- azure-devops - Azure DevOps Pipeline:显示 python 项目的代码覆盖率报告
- shell - awk 如何处理 HDFS 的目录?
- ios - iTunes 无限制地检索所有国家/地区的应用程序的所有评级(有或没有评论)
- python - 简单示例如何使用烧瓶重定向日志消息?
- java - JPA - 如何在构造函数中获取自动生成的 id?
- reactjs - React 中最近查看的组件的改进
- c# - 在处理复杂数据模型时使用 DbContextFactory(每个服务方法/操作都有一个新的 DbContext)
- ssl - 将自签名证书添加到 k8s
- .net-core - 使用计算列时在主键中有两列时出错(EF 迁移)