2015-02-24 202 views
3

在Django Rest Framework 3中,我想返回pk关系的unicode值,您可以使用serializer.StringRelatedField的方式,但我也需要该值可写。 StringRelatedField是只读的。什么是serializers.StringRelatedField的读/写等效项?

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

我在想PrimaryKeyRelatedField可能是要走的路,但查询看起来像什么?

举例来说,如果我想的模式是“模式”,我想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 

在这个例子中,我序列化的汽车,试图返回CarModel的字符串值可以使用表单中的选择下拉菜单进行更新。 如果我使用不同的序列化程序,一个用于需要PK的POST,另一个用于返回字符串的其他所有内容,表单中的select指令变得非常混乱。

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

+0

您能编辑您的问题也包括你的模型? – 2015-02-24 12:02:21

+0

已添加。希望能帮助到你。 – John 2015-02-24 12:25:16

回答

2

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

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

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

我不相信如果这是真正你想要什么,虽然。澄清这类问题的最好方法通常是暂时忘记代码,并专注于精确描述您希望输入和输出表示看起来像什么?

+0

是的,对不起,名字是独一无二的。我想在序列化程序中返回CarModel.name,而不是CarModel.pk或CarModel.slug,所以我可以使用该值来填充选定的小部件。我可以用StringRelatedField执行只读操作,但是我无法通过用户选择的CarModel.name将其POST到API。 – John 2015-02-24 12:36:48

+0

为了说明这种情况,这是努力消除嵌套序列化器的一部分,这些嵌套序列化器越来越混乱。我试图编写一个单一的,整洁的序列化程序,它不嵌套其他序列化程序,并且与多个ReST动词一起工作,并且不需要来自客户端的第二个GET来查找PK的字符串值。但我是新来的ReST,我甚至不确定这样的目标是否是最佳实践。也许你应该总是返回API中的PK,并期望客户端执行第二个数据库调用来查找字符串值? – John 2015-02-24 12:52:36

+0

对我来说,SlugRelatedField与“slug_field ='name''可能是我正在寻找的东西。抱歉太慢了。 – John 2015-02-24 13:04:43