Как управлять записываемыми вложенными сериализаторами с несколькими сериализаторами в уникальном поле? - PullRequest
1 голос
/ 02 апреля 2019

Я работаю над фреймворком django rest с вложенными сериализаторами, и мне нужна поддержка, как разместить объект, который может принимать модели разных типов.

Хороший эскиз лучше, чем длинная речь

Я хочу опубликовать это:

{
    "md5": "365v4a9e8fv4s9efb8",
    "computer": "computer_name",
    "branch": "git_branch",
    "planKey": "Key",
    "buildNumber": 25,
    "pullRequest": false,
    "result": [
        {
            "name": "name of the app",
            "project": "name of project",
            "mode": "release"
            ...
        },
        {
            "name": "name of the app",
            "project": "name of project",
            "mode": "release"
            ...
        }
    ]
}

Или это:

{
    "md5": "365v4a9e8fv4s9efb8",
    "computer": "computer_name",
    "branch": "git_branch",
    "planKey": "Key",
    "buildNumber": 25,
    "pullRequest": false,
    "result": [
        {
            "name": "name of the test",
            "status": "fail",
            "test_suite": "BB"
            ...
        },
        {
            "name": "name of the test",
            "status": "pass",
            "test_suite": "AA"
            ...
        }
    ]
}

В обоих случаях мне нужна та же модель первого уровня верхнего уровня, что и JobResult.Но для поля результата я хочу иметь возможность указать первую модель (Build) или вторую (Test)

models.py:

class JobResult(models.Model):
    md5 = models.CharField(max_length=255, default=None)
    computer = models.CharField(max_length=255)
    branch = models.CharField(max_length=255)
    planKey = models.CharField(max_length=255)
    buildNumber = models.IntegerField()
    pullRequest = models.BooleanField(default=False)
    # Generic Relation between JobResult and (Daily or Test)
    content_type = models.ForeignKey(
        ContentType,
        on_delete=models.CASCADE,
        related_name='result',
        null=True,
        blank=True,
    )
    object_id = models.PositiveIntegerField(null=True)
    result_object = GenericForeignKey('content_type', 'object_id')
    ...


class Build(models.Model):
    name = models.CharField(max_length=255)
    project = models.CharField(max_length=255, default=None)
    mode = models.CharField(max_length=255)
    job_id = GenericRelation(JobResult, blank=True, null=True)
    ...

class Test(models.Model):
    name = models.CharField(max_length=50)
    status = models.CharField(max_length=50)
    test_suite = models.CharField(max_length=50)
    job_id = GenericRelation(JobResult, blank=True, null=True)
    ...

Я попытался использовать универсальныйForeignKey, как вы можете видеть и сослаться на этот пост: Django Rest Framework: записываемые вложенные сериализаторы с общим внешним ключом

Я действительно не знаю, правильно ли я поступаю или нет.Я потерял все посты и ответы, которые мы можем получить из переполнения стека или из Google.Я не знаю, откуда идти, знаю ...

я не покажу свой serializers.py, потому что он такой же, как ссылка, указанная выше, с модификацией для моих моделей.

Последнее, но не менее важное.Я уже сделал записываемые вложенные сериализаторы из документации django rest frammework: https://www.django -rest-framework.org / api-guide / Relations / , и это сработало.я смог ПОСТАВИТЬ JSON с моделью сборки.

Так что мне делать?Я иду правильно?Может кто-нибудь сказать мне, где искать этого короля вещей?

Не стесняйтесь сказать мне, если я полностью ошибаюсь.я тихий новичок в этом.

1 Ответ

0 голосов
/ 03 апреля 2019

Вы можете сделать это, обратившись к полю метода в родительском сериализаторе, а для его метода get вы можете вызвать дочерний сериализатор другой модели, связанной с ним:

class SubSubjectListSerializer(serializers.ModelSerializer):
    topics = serializers.SerializerMethodField()
    sub_subject_id = serializers.CharField(source='id')

    class Meta:
      model = Subsubject
        fields = [
        'sub_subject_id',
        'title',
        'slug',
        'topics'
        ]

    def get_topics(self, obj):
       qs = obj.topics.all().order_by('id')
       return TopicListSerializer(qs, many=True, read_only=True).data


  class SubjectDetailSerializer(serializers.ModelSerializer):
     sub_subjects = serializers.SerializerMethodField()

    class Meta:
      model = Subject
      fields = [
        'id',
        'title',
        'short_name',
        'icon_file',
        'contents',
        'slug',
        'image',
        'is_block',
        'status',
        'created_on',
        'created_by',
        'updated_on',
        'updated_by',
        'meta_description',
        'meta_keywords',
        'head_script',
        'sub_subjects',

    ]

  def get_sub_subjects(self, obj):
    return SubSubjectListSerializer(obj.sub_subjects.exclude(title='Others') 
                                         many=True).data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...