2012-07-26 462 views
2

我想知道,如何只顯示'code_key'長度爲10個字符的記錄?如何按字符串長度過濾django管理界面中的數據(queryset)?

目前如果我使用'qs = Code.objects.filter(code_key。len()= 10)'返回一個錯誤。

在此先感謝。

admin.py

class CodeAdmin(admin.ModelAdmin): 
    fields = ['code_key','redemption_date','user','movie'] 

    # 
    list_display = ('code_key','redemption_date','user','movie') 

    # 
    search_fields = ('code_key','user__email','movie__title') 

    def queryset(self, request): 
     """ 
     Filter the objects displayed in the change_list 
     """ 
     qs = super(CodeAdmin, self).queryset(request) 
     return qs 


    def changelist_view(self, request, extra_context=None): 
     my_context = { 
      'total': 'some value query', 
     } 
     return super(CodeAdmin, self).changelist_view(request,extra_context=my_context) 

models.py

class Code(models.Model): 
    id = models.AutoField(primary_key=True) 
    code_key = models.CharField(max_length=20,unique=True) 
    redemption_date = models.DateTimeField(null=True, blank=True) 
    user = models.ForeignKey(User, blank=True, null=True) 
    movie = models.ForeignKey(Movie, blank=True, null=True) 


    # ... 
    def display_record(self): 
     return (self.code_key.__len__() == 10) 

    # ... 
    def __unicode__(self): 
     return self.code_key 

回答

5

使用MySQL?

qs = Code.objects.extra(where=['CHAR_LENGTH(code_key) = 10']) 
+0

謝謝!它的工作原理:) – ipegasus 2012-07-26 01:23:53

+0

只要意識到這是數據庫特定的。 .extra()直接修改sql。 https://docs.djangoproject.com/en/dev/ref/models/querysets/#extra – 2012-07-26 01:25:54

0

使用

filter(lambda code_object: len(code_object.code_key) == 10, list_of_code_objects) 

它將刪除list_of_code_objects的所有成員爲其中的聲明LEN(code_ob ject.code_key)== 10不返回true。

編輯:它不會影響原始的list_of_code_objects;它會返回一個新的列表,其中只包含通過測試的原始列表中的那些對象。

+0

非常感謝!我想知道如何或在哪裏插入過濾器代碼? 我嘗試: QS = Code.objects.all() 濾波器(拉姆達code_object:LEN(code_object.code_key)== 10,QS) 返回適量 但列表顯示具有不同長度的所有記錄。 – ipegasus 2012-07-26 01:21:37

+0

過濾器功能不會改變原始列表;它會返回一個新的列表,其中只包含那些通過測試的元素。將filter()的結果賦給一個新的變量,比如qs_filtered,或者直接返回filter()的結果。 – CosmicComputer 2012-07-26 01:58:55