我们正在尝试为我们的网站开发一个简单的日志。它应该是可翻译的。我们有以下模型:
class AccountActivity(models.Model):
account = models.ForeignKey(AccountDetails)
user = models.ForeignKey(Customer)
event = models.TextField()
values = models.TextField()
createdAt = models.DateTimeField(auto_now_add=True, auto_now=False, editable=False)
updatedAt = models.DateTimeField(auto_now=True, editable=False)
@property
def message(self):
message = _(self.event)
return_message = message % self.values
return return_message
当用户执行某些操作时,执行以下操作:
def log_event(self, event_message, values):
event = AccountActivity()
event.user = self
event.account = self.account_details
event.event = event_message
event.values = values
event.save()
有时候,事件为格式字符串保存了几个占位符,例如:
"Group %s was deleted with the reason: %s"
数据库将参数保存为元组:
(u'TestGroup', u'This is just for testing purposes')
在另一条仅包含一个占位符的消息中,它将值保存为普通字符串。
当使用message
属性打印出这些属性时,只能正确返回单值事件,而无法显示带有元组的事件。 (不会抛出任何错误)
模板如下所示:
{% for l in logs %}
<tr>
<td>{{ l.message }}</td>
<td>{{ l.createdAt }}</td>
<td>{{ l.user.email }}</td>
</tr>
{% endfor %}
这怎么可能? Python应该识别元组?我不知道如何处理这个问题,解析事件并检查预期有多少个参数,然后将这些值声明为元组?即使它已经被保存为元组?
答案 0 :(得分:0)
values
字段定义为models.TextField
,因此它存储字符串,而不是元组或其他任何内容。对于您提供的示例,数据库存储字符串"(u'TestGroup', u'This is just for testing purposes')"
,它是元组的字符串表示形式。
您需要serialize元组(将其转换为字符串)以将其保存到数据库,并在使用它格式化消息之前对其进行反序列化(将存储的字符串转换回元组)。以下(未经测试)使用JSON作为序列化表示,但您可以选择其他方法:
import simplejson as json
class AccountActivity(models.Model):
...
@property
def message(self):
# Deserialization happens here
values = json.loads(self.values)
if isinstance(values, list):
values = tuple(values)
message = _(self.event)
return_message = message % values
return return_message
def log_event(self, event_message, values):
event = AccountActivity()
event.user = self
event.account = self.account_details
event.event = event_message
event.values = json.dumps(values) # serialization happens here
event.save()
请注意,JSON只处理单值类型,如字符串,整数和列表/元组(都存储为数组 - 这就是我在上面的代码中强制转换为tuple
的原因)。如果您需要存储日期/时间或其他类型,则可能需要使用pickle或其他序列化库。