考虑以下示例模型:
class MyModel(models.Model):
TYPE_ONE = 1
TYPE_TWO = 2
TYPE_CHOICES = (
(TYPE_ONE, "One"),
(TYPE_TWO, "Two"),
)
type = models.SmallIntegerField(choices=TYPE_CHOICES)
# ... other fields
这在内部运作良好,因为我现在有一个常数'我可以在整个代码中重复使用它来引用每个type
。
但是,当此模型被序列化并通过自定义API控制器实现作为JSON发送到客户端时,它会将类型转换为其文本表示形式。它可能看起来像这样:
{
'id': 1,
'type': 'One'
}
这很好,但是我希望能够根据此文本版本设置字段值(我的API的使用者希望能够传递友好的字符串,而不是整数)。
在构建模型实例时,如何将type
设置为One
,并让它自动将其转换为相关的int
?
类似的东西:
m = MyModel()
m.type = "One"
m.save() # throws a ValueError
由于
答案 0 :(得分:1)
您可以使用此解决方法:
m.type = dict((key,value) for (value,key) in MyModel.TYPE_CHOICES)['One']
答案 1 :(得分:0)
你应该为它制作一个属性。所以你可以随时使用。
class MyModel(object):
TYPE_CHOICES = ((1, "One"), (2, "Two"))
type = models.SmallIntegerField(choices=TYPE_CHOICES)
def getx(self):
return self.type
def setx(self, val):
ch = filter(lambda y: y if y[1] == val else None, self.TYPE_CHOICES)
self.type = ch[0][0]
type_val = property(getx, setx)
然后像这样保存。
m = MyModel()
m.type_val = "One"
m.save()
它将保存为类型。
希望它对你有用。 :)