serializers.StringRelatedField的读/写等价物是什么?

时间:2015-02-24 06:15:09

标签: django django-rest-framework

在Django Rest Framework 3中,我想返回pk关系的unicode值,你可以使用serializer.StringRelatedField的方式,但我也需要值可写。 StringRelatedField是只读的。

我不在乎API是否接受PUT上的pk或字符串值(虽然接受字符串会很漂亮,并且会节省我抓住所有pks!)。 API只需要在GET上返回unicode字符串值。

我认为PrimaryKeyRelatedField可能就是这样,但查询是什么样的?

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

name = serializers.PrimaryKeyRelatedField(queryset=Model.objects.get(pk=????))

我很挣扎,因为我不知道如何从序列化程序对象获取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

在此示例中,我将序列化Car,尝试返回可以使用表单中的选择下拉列表更新的CarModel字符串值。 如果我使用不同的序列化程序,一个用于期望PK的POST,另一个用于返回字符串的其他所有序列化程序,则表单中的select指令会非常混乱。

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

1 个答案:

答案 0 :(得分:3)

  

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

这意味着“' name'应该是独特的。如果它不是唯一的,则查找可能会返回多个实例。在示例中,您目前拥有' name'并不是唯一的,但如果是,那么你可以使用...

car_model = serializers.SlugRelatedField(queryset=..., lookup_field='name')

我不相信这实际上是不是你想要的。澄清这些问题的最佳方法通常是暂时忘记代码,只关注对输入和输出表示形式的精确描述?...