Django Module和Varbinary()字段

时间:2013-10-14 12:05:40

标签: python django django-models django-templates django-views

我有这个Django 模型

class Log(models.Model):
    idlog = models.CharField(max_length=16L, db_column='idLog') # Field name made lowercase.
    idhandle = models.CharField(max_length=16L, db_column='idHandle') # Field name made lowercase.
    idprevious = models.CharField(max_length=16L, db_column='idPrevious', blank=True) # Field name made lowercase.
    idseverity = models.IntegerField(db_column='idSeverity') # Field name made lowercase.
    iderrorcode = models.IntegerField(null=True, db_column='idErrorCode', blank=True) # Field name made lowercase.
    eventdate = models.DateTimeField(db_column='eventDate') # Field name made lowercase.
    trace = models.CharField(max_length=1024L, blank=True)
    message = models.CharField(max_length=1024L, blank=True)
    method = models.CharField(max_length=32L, blank=True)
    class_field = models.CharField(max_length=32L, db_column='class', blank=True) # Field renamed because it was a Python reserved word.
    backedup = models.IntegerField(null=True, db_column='backedUp', blank=True) # Field name made lowercase.
    id = models.IntegerField(primary_key=True)

    class Meta:
        db_table = 'log'

    def __unicode__(self):  # Python 3: def __str__(self):
        return self.message

idlog,idhandle和idprevious是MySQL DB表中Varbinary(16)的字段。 它们中的每一个都拥有全球唯一标识符(GUID)。

在我的查看中,有一种简单的方法:

def logger_handle(request):

    tableSize = Handle.objects.all().__len__()
    handles = Handle.objects.all().order_by('id')[tableSize - 20:tableSize]

    context = {'handles': handles}
    return render_to_response('ate_logger/logger_handle.html', context, context_instance=RequestContext(request))

在logger_handle.html 模板我有这张表:

<table width="100%" class="gridtable">
    <tr>
        <th style="width: 100px">idlog</th>
        <th style="width: 100px">idhandle</th>
        <th style="width: 100px">idprevious</th>
        <th style="width: 180px">eventdate</th>
        <th style="width: 50px">severity</th>
        <th style="width: 50px">errorcode</th>
        <th style="width: 300px">trace</th>
        <th style="width: 300px">message</th>
        <th style="width: 110px">method</th>
    </tr>

    {% for log in logs %}
    <tr>
        <td>{{ log.idlog }}</td>
        <td>{{ log.idhandle }}</td>
        <td>{{ log.idprevious }}</td>
        <td>{{ log.eventdate }}</td>
        <td>{{ log.idseverity }}</td>
        <td>{{ log.iderrorcode }}</td>
        <td>{{ log.trace }}</td>
        <td>{{ log.message }}</td>
        <td>{{ log.method }}</td>
    </tr>
    {% endfor %}
</table>

我的问题(正如你在图片中看到的)是idlog,idhandle和idprevious没有值(除非它在表中是None)

enter image description here

在使用binascii的查看我可以使用命令binascii.b2a_hex(value['idhandle'])将其转换为普通字符串,因此我可以看到guid。

我的问题是如何在模型图层设置它,如何告诉django转换它并将其作为字符串传输到视图,以便我可以显示很容易在模板上。

1 个答案:

答案 0 :(得分:1)

可能你应该创建自定义字段类来表示idlog,idhandle和idprevious,如下所述:https://docs.djangoproject.com/en/dev/howto/custom-model-fields/#converting-field-data-for-serialization并将转换代码放在自定义字段类的value_to_string方法体中。

注意:您应该在查询集上调用count()而不是调用。 len (),否则您将获取并检查整个数据以仅计算长度。

另外,如果你要检查对象长度使用函数len(),它会为你调用 len ()。