Добавьте связанные поля ForeignKey с сериализатором в Django REST Framework - PullRequest
0 голосов
/ 30 мая 2019

Я использую Django 2.2 и Django REST Framework

У меня есть три модели, такие как

class Plan(models.Model):
    name = models.CharField(_('Plan Name'), max_length=100)
    default = models.NullBooleanField(default=None, unique=True)
    created = models.DateTimeField(_('created'), db_index=True)
    quotas = models.ManyToManyField('Quota', through='PlanQuota')

class Quota(models.Model):
    codename = models.CharField(max_length=50, unique=True)
    name = models.CharFieldmax_length=100)
    unit = models.CharField(max_length=100, blank=True)

class PlanQuota(models.Model):
    plan = models.ForeignKey('Plan', on_delete=models.CASCADE)
    quota = models.ForeignKey('Quota', on_delete=models.CASCADE)
    value = models.IntegerField(default=1, null=True, blank=True)

Мне нужно получить все quota и их значение из PlanQuota в сериализаторе планов при получении списка планов.

У меня есть следующий сериализатор

class PlanQuotaSerialier(serializers.ModelSerializer):
    class Meta:
        model = PlanQuota
        depth = 1
        fields = ['quota', 'value']


class PlanListSerializer(serializers.ModelSerializer):
    plan_quota = PlanQuotaSerialier(read_only=True, many=True)

    class Meta:
        model = Plan
        depth = 1
        fields = ['name', 'default', 'created', 'plan_quota']

Но в ответе нет plan_quota.

Как добавить все квоты и их значения для каждого плана в одном запросе (SQL JOIN)?

Редактировать 2:

Добавление source в поле сериализатора сработало

plan_quota = PlanQuotaSerialier(source='planquota_set', many=True)

И результат как

"results": [
        {
            "name": "Test Plan 1",
            "default": true,
            "plan_quotas": [
                {
                    "quota": {
                        "id": 1,
                        "order": 0,
                        "codename": "TEST",
                        "name": "Test Domain",
                        "unit": "count",
                        "description": "",
                        "is_boolean": false,
                        "url": ""
                    },
                    "value": 10
                },
             ]
       }
]

Можно ли объединить все поля из quota с полем value в списке plan_quotas?

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Вот как я это решил.

  1. Для первого запроса добавлено source

    plan_quota = PlanQuotaSerialier (source = 'planquota_set', many =True)

  2. Для удаления ключа quota, добавлено to_presentation() в PlanQuotaSerializer

    def to_representation(self, instance):
    
        representation = super().to_representation(instance)
        if 'quota' in representation:
            representation['quota']['quota_id'] = representation['quota'].pop('id')
            representation.update(representation.pop('quota'))
    
        return representation
    
0 голосов
/ 30 мая 2019
class PlanQuota(models.Model):
    plan = models.ForeignKey('Plan', on_delete=models.CASCADE, related_name='plan_quotas')
    quota = models.ForeignKey('Quota', on_delete=models.CASCADE)
    value = models.IntegerField(default=1, null=True, blank=True)

class PlanListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Plan
        depth = 1
        fields = ['name', 'default', 'created', 'plan_quotas']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...