2010-07-05 17 views
2

我有以下型號:Django的有無到外鍵分享約束

class Program(models.Model): 
    name = models.CharField(max_length = 128) 
    def __unicode__(self): 
     return self.name 
class Cheat(models.Model): 
    program = models.ForeignKey(Program) 
    shortcut = models.CharField(max_length = 64) 
    description = models.CharField(max_length = 512) 
    def __unicode__(self): 
     return u"(%s) - %s" % (self.shortcut, self.description) 
class Category(models.Model): 
    #program = models.ForeignKey(Program) 
    name = models.CharField(max_length = 128) 
    def __unicode__(self): 
     return self.name 
class Sheet(models.Model): 
    program = models.ForeignKey(Program) 
    name = models.CharField(max_length = 128) 
    def __unicode__(self): 
     return self.name 
class CategorizedCheat(models.Model): 
    order = models.IntegerField(unique = True) 
    sheet = models.ForeignKey(Sheet) 
    cheat = models.ForeignKey(Cheat) 
    category = models.ForeignKey(Category) 
    def __unicode__(self): 
     return unicode(self.cheat) 

在管理,我想內嵌顯示與CategorizedCheats圖紙。 問題是,我不能只有作爲工作表相同的程序作弊。有沒有辦法用Sheet.program過濾thoses?或者我的模型有問題嗎?

+0

只是爲了澄清:這意味着您正在編輯屬於管理員表單的InlineAdmin中的CategorizedCheat對象? – 2010-07-05 21:22:15

+0

@lazerscience:是的 – slurdge 2010-07-06 07:34:29

回答

1

當Django的管理中過濾在ForeignKeys可用的對象,正確的答案是幾乎總是ModelAdmin.formfield_for_foreignkey:

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

的文檔有介紹如何做幾乎正是你在找什麼。希望有所幫助!

+0

是的,我想到了那個函數,不幸的是,我不知道該在queryset中放什麼,我怎麼知道我自己的self.program? 也就是類MySheetAdmin(admin.ModelAdmin),我如何訪問當前的Sheet.program?從這個很簡單。 – slurdge 2010-07-06 07:40:14

0

下面是最終的解決方案由於加布裏埃爾:

def formfield_for_foreignkey(self, db_field, request, **kwargs): 
    if db_field.name == "cheat": 
     kwargs["queryset"] = Cheat.objects.filter(program=Sheet.objects.get().program) 
     return db_field.formfield(**kwargs) 
    return super(CategorizedCheatAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

訣竅是使用Sheet.objects.get()程序,這是我所缺乏的信息。