通过选择文本名称设置Django模型字段

时间:2016-03-29 07:17:50

标签: python django django-models

考虑以下示例模型:

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

由于

2 个答案:

答案 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()

它将保存为类型。

希望它对你有用。 :)