2016-07-22 6 views
1

foreignkey管理者の変更/追加フォームのリストを中国語ピンインでソートすることができるように[ORDER BY CONVERT (name USING gbk) ASC]出来ますか?Django、[ORDER BY CONVERT(名前USING gbk)ASC]を使用してクエリを作成する方法

DB:MySQLの、 サンプルクラスはブロー(:utf8_general_ciテーブルcommoninfoの文字セット)である

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) 

Iは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.

+0

なぜ必要な ' 'CONVERT(名前使用したGBK)''? – doniyor

+0

テーブルの文字セットは、[ORDER BY chinese_data_field]、 を使用して正しい(期待される)注文を得ることができないutf8_general_ciです。中国語ピンインで期待している注文をしているようですが、テーブルをgbkに隠すか、注文フィールド。 – alice

答えて

0
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()) 

ドキュメント:

+0

ありがとう、コードはとてもうまく動作し、ドキュメントから多くを学びました:) – alice

関連する問題