2012-07-26 96 views
1

我想知道如何過濾由外鍵字段設置的Django查詢?如何在django admin中過濾由外鍵字段設置的django查詢?

以下工作在沒有外鍵的模型中。例如,

codes = Code.objects.extra(where=['CHAR_LENGTH(code_key) = 10']) 

但它不適用於帶有外鍵的模型。例如,

codes_fk = CodeRegistry.objects.extra(where=['CHAR_LENGTH(code__code_key) = 10']) 

我想在'CodeRegistry'管理列表中只顯示長度爲10個字符的代碼。提前致謝!

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) 

class CodeRegistry(models.Model): 
    code = models.ForeignKey(Code, blank=False, null=False, unique=True) 
    view_count = models.IntegerField(default=0) 
    last_watch_date = models.DateTimeField(null=True, blank=True) 
    ip = models.IPAddressField(null=False,blank=False) 

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 to only 
     display those for the currently signed in user. 
     """ 
     codes = Code.objects.extra(where=['CHAR_LENGTH(code_key) = 10']) 
     return codes 


class CodeRegistryAdmin(admin.ModelAdmin): 
    fields = ['code','view_count','last_watch_date','ip'] 

    list_display = ('code','view_count','last_watch_date','ip') 

    # 
    search_fields = ['code'] 

    def queryset(self, request): 
     """ 
     Filter the objects displayed in the change_list to only 
     display those for the currently signed in user. 
     """ 
     codes_fk = CodeRegistry.objects.extra(where=['CHAR_LENGTH(code_key) = 10']) 
     return codes_fk 

回答

5

CHAR_LENGTH(code__code_key)是SQL。它不知道code__前綴。

一個可能的解決方案是:

code_regs = CodeRegistry.objects.filter(
    code__in=Code.objects 
       .extra(where=['CHAR_LENGTH(code_key) = 10'])) 
+0

完美!謝謝! – ipegasus 2012-07-26 17:28:48

相關問題