Django - сериализация объектов модели с зависимостями - PullRequest
0 голосов
/ 04 февраля 2020

При сериализации набора запросов объектов модели TestChild я бы хотел, чтобы json включал зависимые объекты TestParent.

Вот мой код:

from django.db import models


class TestParentManager(models.Manager):
    def get_by_natural_key(self, field1, field2):
        return self.get(field1=field1, field2=field2)


class TestParent(models.Model):
    field1 = models.CharField(max_length=20, blank=True, default='')
    field2 = models.CharField(max_length=20, blank=True, default='')
    field3 = models.CharField(max_length=20, blank=True, default='')

    objects = TestParentManager()

    def natural_key(self):
        return (self.field1, self.field2)

    class Meta:
        unique_together = [['field1', 'field2']]


class TestChildManager(models.Manager):
    def get_by_natural_key(self, field1, field2):
        return self.get(field1=field1, field2=field2)


class TestChild(models.Model):
    parent = models.ForeignKey(TestParent, on_delete=models.CASCADE)
    field1 = models.CharField(max_length=20, blank=True, default='')
    field2 = models.CharField(max_length=20, blank=True, default='')
    field3 = models.CharField(max_length=20, blank=True, default='')

    objects = TestChildManager()

    def natural_key(self):
        return (self.field1, self.field2)
    natural_key.dependencies = ['environ_tool.testparent']

    class Meta:
        unique_together = [['field1', 'field2']]

Когда я запускаю

serializers.serialize(
    'json',
    eModels.TestChild.objects.all(),
    use_natural_foreign_keys=True,
    use_natural_primary_keys=True,
)

результирующий json выглядит примерно так (без объектов TestParent):

[{u'fields': {u'field1': u'f1',
              u'field2': u'f2',
              u'field3': u'f3',
              u'parent': [u'foo2', u'']},
  u'model': u'environ_tool.testchild'}]

, но я бы хотел видеть объект TestParent, от которого зависит объект TestChild, в json тоже вот так:

[{u'fields': {u'field1': u'foo2', u'field2': u'', u'field3': u''},
  u'model': u'environ_tool.testparent'},
 {u'fields': {u'field1': u'f1',
              u'field2': u'f2',
              u'field3': u'f3',
              u'parent': [u'foo2', u'']},
  u'model': u'environ_tool.testchild'}]

Документы django заставляют меня поверить, что это должно произойти в сериализации, но не повезло. Я использую Django 1.11, и вот страница do c https://docs.djangoproject.com/en/1.11/topics/serialization/

Спасибо!

1 Ответ

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

вы можете написать класс сериализатора для потомка.

class ChildSerializer(serializers.ModelSerializer):
    class Meta:
        model = childmodel
        fields = '__all__'
        depth = 1

, и вы можете назвать его как

serializer = ChildSerializer([childinstance1, ], many=True)

, затем вы можете преобразовать его в json

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...