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')
我有一个 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')