mysql - Django,如何使用 [ORDER BY CONVERT (name USING gbk) ASC] 进行查询

标签 mysql django

我想使用 [ORDER BY CONVERT (name USING gbk) ASC] 进行查询,以便管理员更改/添加表单中的 foreignkey 列表可以按以下方式排序汉语拼音,可能吗?

数据库:mysql, 示例类如下(表commoninfo的字符集:utf8_general_ci):

class CommonInfo(models.Model):
    name = models.CharField(max_length=128)
    def __str__(self):
        return self.name

class Personal(CommonInfo):
    first_name = models.CharField(max_length=128,null=True, blank=True, default = None)
    last_name = models.CharField(max_length=128,null=True, blank=True, default = None)

class Profile(models.Model):
    personal_info = models.ForeignKey(Personal, null=True, blank=True, default = None)
    mobile = models.CharField(max_length=32,default='',null=True, blank=True)

我在 ProfileAdmin 中尝试了以下 2 种方法,但都不起作用

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == "personal_info":    

        #raw_sql = 'SELECT id as commoninfo_ptr_id, name FROM share_commoninfo ORDER BY CONVERT (name USING gbk) ASC'
        #raw_querySet = Personal.objects.raw(raw_sql) 
        #kwargs["queryset"] = raw_querySet

        querySet = Personal.objects.extra(order_by=['CONVERT (name USING gbk)'])
        kwargs["queryset"] = querySet

        return super(ProfileAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

admin.site.register(models.Profile, ProfileAdmin)

FieldError: Cannot resolve keyword 'CONVERT (name USING gbk)' into field. Choices are: commoninfo_ptr, commoninfo_ptr_id, first_name, id, last_name, name, profile, Check fields/fieldsets/exclude attributes of class ProfileAdmin.

最佳答案

from django.db.models import Func, Value

class Convert(Func):
    def __init__(self, expression, transcoding_name, **extra):
         super(Convert, self).__init__(
             expression, transcoding_name=Value(transcoding_name), **extra)

    def as_mysql(self, compiler, connection):
        self.function = 'CONVERT'
        self.template = '%(function)s(%(expressions)s AS %(transcoding_name)s)'
        return super(Conver, self).as_sql(compiler, connection)

用法:

queryset.order_by(Convert('name', 'gbk').asc())

文档:

关于mysql - Django,如何使用 [ORDER BY CONVERT (name USING gbk) ASC] 进行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38517743/

相关文章:

php - 无法更新 CakePHP 中的记录

JAVA & MySQL 不需要的额外列

php - 如何选择从哪里开始mysql_fetch_row?

mysql - 将 unicode 插入数据库时​​ MySQL 中的排序规则非法混合

Django REST Framework 可浏览的 api 过滤器控件未显示

php - 如何使用php向mysql数据库插入多行,增加1行

django - 如何在 Django URL 路径中使用 next_page

python - 无法解析超链接关系的 URL

javascript - Django:返回[Object object]而不是django View 数组

java - Bluemix Liberty server.xml MySQL 数据源配置