概述
问题:
定义好了序列化器后有没有遇到过想要序列化的数据表中有外键的情况,我们需要的这个和外键关联的数据
model.py
# 报警表
class Police(models.Model):
# 报警类型
police = models.CharField(max_length=50)
# 开始范围
begin = models.CharField(max_length=20,null=True)
# 结束范围
end = models.CharField(max_length=20,null=True)
# 阈值
value = models.CharField(max_length=20)
# 货物类型(w)
cargo = models.models.ForeignKey(Cargo,on_delete=models.CASCADE)
class Meta:
db_table = 'police'
# 货物类型
class Cargo(models.Model):
# 货物名
name = models.CharField(max_length=50)
# 设备类型
equ = models.CharField(max_length=50)
# 描述
brief = models.CharField(max_length=200)
# 创建时间
create_time = models.DateField(default = timezone.now)
# 更新时间
update_time = models.DateTimeField(auto_now=True)
# 延迟时间
delay = models.IntegerField()
# 记录间隔
record = models.IntegerField()
# 理想开始范围
begin = models.CharField(max_length=20)
# 理想结束范围
end = models.CharField(max_length=20)
class Meta:
db_table = 'cargo'
定义嵌套序列化器:
class PoliceSer(serializers.ModelSerializer):
# 有外键的一方
class Meta:
model = Police
fields = '__all__'
# 货物类型
class CargoSer(serializers.ModelSerializer):
class Meta:
model = Cargo
fields = '__all__'
解决方法:
将PoliceSer变为嵌套序列化
第一种
class PoliceSer(serializers.ModelSerializer):
# 有外键的一方
cargo = CargoSer()
# 将外键字段序列化
class Meta:
model = Police
fields = '__all__'
第二种
class PoliceSer(serializers.ModelSerializer):
# 有外键的一方
class Meta:
model = Police
fields = '__all__'
depth = 1
# 会去找是外键的字段然后序列化
# 1 代表的是序列化的深度,意思就是序列化的的数据表中加入还有关联的外键是否序列化
以上方法是建立在你的那个外键字段是ForeignKey的情况下
如果你的外键是逻辑外键(IntegerField)
以上方法就会报错
然后只能使用for来序列化
class CargoView(APIView):
def get(self,request):
# ser = PoliceSer(Police.objects.all(),many=True).data
cargo = Cargo.objects.filter()
ser = CargoSer(cargo,many=True).data
for i in ser:
police = Police.objects.filter(cargo=i.get("id"))
p = PoliceSer(police,many=True).data
i['police'] = p
return Response(ser)
最后
以上就是俊逸大神为你收集整理的django中restframework嵌套序列化的全部内容,希望文章能够帮你解决django中restframework嵌套序列化所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复