首页 > 解决方案 > 当字段来自许多表 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"
                        }
                    ]

                }


            ]
        }
    ]
},

就像关联所有表的连接一样。

端点检索这些数据的最佳方法是什么?

谢谢你!

标签: pythondjangodjango-rest-framework

解决方案


您不需要为每个模型定义序列化程序,而是可以使用depth属性通过 django rest 框架来序列化嵌套对象,如下所示:

class operacoesSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.operacoes
        fields = (
            'pk', 
            'date', 
            'types',
        )
        depth = 3

这将生成具有 3 级嵌套的嵌套对象。


推荐阅读