Serializers.StringRelatedField 的读/写等效项是什么?

Joh*_*ohn 4 django django-rest-framework

在 Django Rest Framework 3 中,我想返回 pk 关系的 unicode 值,就像使用 serializer.StringRelatedField 一样,但我也需要该值可写。StringRelatedField 是只读的。

我不关心 API 是否接受 PUT 上的 pk 或字符串值(尽管接受字符串会很漂亮,并且可以节省我获取所有 pk 的时间!)。API 只需要在 GET 上返回 unicode 字符串值。

我认为 PrimaryKeyRelatedField 可能是可行的方法,但是查询是什么样的?

例如,如果我想要的模型是“Model”,并且我想要序列化 ​​Model.name,那么这个命令是什么样的:

name = serializers.PrimaryKeyRelatedField(queryset=Model.objects.get(pk=????))
Run Code Online (Sandbox Code Playgroud)

我很挣扎,因为我不知道如何从序列化器对象中获取 pk 以便查询相关模型......

当然,这是假设 PrimaryKeyRelatedField 是我所需要的。这可能是完全错误的。

谢谢

约翰

以下是根据要求提供的示例模型,为了清晰起见,略有更改:

class CarModel(models.Model):
  name = models.CharField(max_length=100,unique=True)

  def __str__(self):
    return self.name


class Car(models.Model):
  name = models.CharField(max_length=100)
  make = models.ForeignKey(CarMake)
  car_model = models.ForeignKey(CarModel)

class CarSerializer(serializers.ModelSerializer):
   car_model = serializers.StringRelatedField() //like this, but read/write

   class Meta:
   model = Car
Run Code Online (Sandbox Code Playgroud)

在此示例中,我正在序列化 Car,尝试返回 CarModel 的字符串值,该值可以使用表单中的选择下拉列表进行更新。如果我使用不同的序列化器,一种用于需要 PK 的 POST,另一种用于返回字符串的其他所有序列,则表单中的 select 指令会变得非常混乱。

因此,理想情况下,我只希望能够 POST 字符串值,并让 API 完成查找并将字符串保存为 PK。

Tom*_*tie 5

“我只是希望能够 POST 字符串值,并让 API 完成查找并将字符串保存为 PK。”

这意味着“名称”应该是唯一的。如果它不唯一,则查找可能会返回多个实例。在示例中,您当前的“名称”不是唯一的,但如果是,那么您可以使用...

car_model = serializers.SlugRelatedField(queryset=..., lookup_field='name')
Run Code Online (Sandbox Code Playgroud)

我不相信这是否真的是你想要的。澄清此类问题的最佳方法通常是暂时忘记代码,而只专注于您希望输入和输出表示形式的精确描述?...

  • 这很有效,正如 Kevin 和 Tom 所说:“car_model = serializers.SlugRelatedField(queryset=CarModel.objects.all(), slug_field='name')”。多谢你们! (4认同)