Python Django:将数据从模型转换为视图的最佳方式
MyDjango应用程序在表视图中显示数据库中的对象。问题是这些对象(模型)相当复杂:它们有50多个字段。几乎每个字段我都要做一些格式化:Python Django:将数据从模型转换为视图的最佳方式,python,django,Python,Django,MyDjango应用程序在表视图中显示数据库中的对象。问题是这些对象(模型)相当复杂:它们有50多个字段。几乎每个字段我都要做一些格式化: 将国际电话号码71234567689转换为“+7(123)456789” 显示带空格的长价格:“7000 000”而不是“7000000” 从几个字段(如“street”、“house”等)构造完整地址(如果逻辑非常复杂,有几个if-else-s) 等等 Django模板语言有几个用于简单情况的有用标记,但我想在一般情况下(如我的情况)不适合用于严重的格
- 将国际电话号码71234567689转换为“+7(123)456789”
- 显示带空格的长价格:“7000 000”而不是“7000000”
- 从几个字段(如“street”、“house”等)构造完整地址(如果逻辑非常复杂,有几个if-else-s)
- 等等
所以最好的方法是指导django“如何渲染”。有可能吗?您可以使用Django rest框架 文档()中的示例
类颜色(对象):
"""
RGB颜色空间中表示的颜色。
"""
def __;初始(自身、红色、绿色、蓝色):
断言(红色>=0,绿色>=0,蓝色>=0)
断言(红色<256,绿色<256,蓝色<256)
self.red,self.green,self.blue=红,绿,蓝
类ColorField(serializers.Field):
"""
颜色对象被序列化为“rgb(#、#、#)符号”。
"""
def至_表示(自身、obj):
返回“rgb(%d,%d,%d)”%(对象红色、对象绿色、对象蓝色)
def至_内部_值(自身、数据):
data=data.strip('rgb(').rstrip('))
红、绿、蓝=[int(col)表示数据中的col.split(',')]
返回颜色(红色、绿色、蓝色)
定义自定义序列化程序/字段后。如果您使用的是
Django Rest Framework
,则只需指定要使用哪个序列化程序来表示数据,就可以简单地使用序列化程序。但我认为情况并非如此。您想要完成的任务似乎与django表单的角色非常相似,但它们仅用于(传统上)保存/更新模型,即POST请求。现在,您可以定义一个用于过滤/渲染的新类并在视图中使用它,或者直接使用django表单,它将自动为不同的字段提供基本的清理。我不使用djang rest框架,我认为这有点过分了。UI是只读的,所以我只需要模型到视图的转换。表单也不适合:一些转换非常复杂:取该字段,检查是否满足条件,否则检查该字段,等等。我想我将创建一个独立类,并在查询集上迭代以将模型转换为此类。但我还是不喜欢:(当然,只要创建一个渲染器类,如果您想使用一些内置功能,您可以从表单基类继承。
class Color(object):
"""
A color represented in the RGB colorspace.
"""
def __init__(self, red, green, blue):
assert(red >= 0 and green >= 0 and blue >= 0)
assert(red < 256 and green < 256 and blue < 256)
self.red, self.green, self.blue = red, green, blue
class ColorField(serializers.Field):
"""
Color objects are serialized into 'rgb(#, #, #)' notation.
"""
def to_representation(self, obj):
return "rgb(%d, %d, %d)" % (obj.red, obj.green, obj.blue)
def to_internal_value(self, data):
data = data.strip('rgb(').rstrip(')')
red, green, blue = [int(col) for col in data.split(',')]
return Color(red, green, blue)