Python Django可翻译日志从数据库,事件和值为db列

时间:2016-01-08 18:01:48

标签: python django

我们正在尝试为我们的网站开发一个简单的日志。它应该是可翻译的。我们有以下模型:

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应该识别元组?我不知道如何处理这个问题,解析事件并检查预期有多少个参数,然后将这些值声明为元组?即使它已经被保存为元组?

1 个答案:

答案 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或其他序列化库。