2010-07-05 15 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()程序,这是我所缺乏的信息。