Проблема с Django Сериализаторами, когда поля из многих таблиц FK - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь понять, как работает сериализатор из 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"
                        }
                    ]

                }


            ]
        }
    ]
},

Как соединение, связывающее все таблицы.

Какой лучший способ сделать конечную точку для получения этих данных?

Спасибо!

1 Ответ

0 голосов
/ 10 февраля 2020

Вам не нужно определять сериализаторы для каждой модели, вместо этого вы можете использовать свойство depth для сериализации вложенных объектов с django структурой отдыха, например:

class operacoesSerializer(serializers.ModelSerializer):

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

Это создаст вложенные объекты с 3 уровнями вложенности.

...