SerializerMethodField 始终 returns 相同的值并排除字段

SerializerMethodField always returns the same value and excludes fields

我有一个 API 可以发送一些样本数据。我正在尝试使用 Django 的 SerializerMethodField() 更改输出的表示形式。但它没有按预期工作,因为我总是返回相同的数据并且这些字段没有显示在我的输出中。

我有三个模型,如下所示:2 个通过外键关联的模型:

class Machine(models.Model):
    machine_name            = models.CharField(max_length=120)

    def __str__(self):
        return self.machine_name
class Project(models.Model):
    project_name            = models.CharField(max_length=120)

    def __str__(self):
        return self.project_name

还有这样一个模型:

class Simulation(models.Model):
    user                    = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=1)
    machine                 = models.ForeignKey(Machine, on_delete=models.CASCADE, default=1)
    project                 = models.ForeignKey(Project, on_delete=models.CASCADE, default=1)

我这样创建数据:

test_api_local(method="post", data={"machine":2, "project":1 })

我想实现的是,当我用machine:2发送数据时,它应该将这台机器2的名称写入结果。 喜欢 'machine' : 'machinenametwo'.

我尝试使用 SerializerMethodField。我知道它是只读的,但由于我实际上并没有更改数据,只是操纵它,所以我认为这样的事情可能会起作用:

class SimulationSerializer(serializers.ModelSerializer):
    machine = serializers.SerializerMethodField()
    project = serializers.SerializerMethodField()


    class Meta:
        model = Simulation

        fields = ('project',
                  'machine',     
                  )

    def get_machine(self, obj):
        print(obj.machine)
        project_name = obj.project.project_name
        return str(project_name)

这不起作用,因为我的田间机器不再出现了。同样在调试它时(使用打印语句),我意识到无论我发送什么数据,它总是打印出我的第一台机器的名称。

如果我这样做 test_api_local(method="post", data={"machine":2, "project":1 }) 它会打印机器 1 的名称。

如果我这样做 test_api_local(method="post", data={"machine":3, "project":1 }) 它会打印机器 1 的名称。结果相同....

所以我的问题是:我尝试的方法是否正确,如果是,我做错了什么。

如果不是,怎么办?

非常感谢您的帮助或提示!

机器得到 1 的原因是因为这是该字段的默认值。您将获得默认值,因为 serializers.SerializerMethodField() 是只读序列化程序,因此它不会接受输入。如果您使用 PrimaryKeyRelatedField() 那么它将接受您的数据。

class SimulationSerializer(serializers.ModelSerializer):
    machine = serializers.PrimaryKeyRelatedField(queryset=Machine.objects.all())
    project = serializers.PrimaryKeyRelatedField(queryset=Project.objects.all())

    class Meta:
        model = Simulation
        fields = ('project', 'machine')