如何在唯一字段中管理具有多个序列化器的可写嵌套序列化器?

时间:2019-04-02 18:31:19

标签: django django-rest-framework django-serializer

我正在使用带有嵌套序列化器的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。但是对于结果字段,我希望能够给出第一个模型(构建)或第二个模型(测试)

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: Writable nested serializers with Generic Foreign Key

我真的不知道我做对与否。我对所有帖子和答案感到很迷失,我们可以从堆栈溢出或谷歌获得答案。我不知道从哪里知道...

我不会显示我的serializers.py,因为它与上面引用的对我的模型进行修改的链接相同。

最后但并非最不重要。我已经从django rest frammework docs:https://www.django-rest-framework.org/api-guide/relations/做了一个可写的嵌套序列化程序,它确实起作用了。我能够使用构建模型发布json。

那我该怎么办?我说对了吗?谁能告诉我在哪里寻找这位事物之王?

请毫不犹豫地告诉我我是否完全误解了。我对此很陌生。

1 个答案:

答案 0 :(得分:0)

您可以通过引用父序列化器中的methodfield来执行此操作,对于其get方法,您可以调用与之相关的其他模型的子序列化器:

sizeof