在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。
答案 0 :(得分:3)
"我只是希望能够POST字符串值,并让API完成查找并将字符串保存为PK。"
这意味着“' name'应该是独特的。如果它不是唯一的,则查找可能会返回多个实例。在示例中,您目前拥有' name'并不是唯一的,但如果是,那么你可以使用...
car_model = serializers.SlugRelatedField(queryset=..., lookup_field='name')
我不相信这实际上是不是你想要的。澄清这些问题的最佳方法通常是暂时忘记代码,只关注对输入和输出表示形式的精确描述?...