Django admin:将多对多关系项限制为新创建的关系项

时间:2010-12-14 19:06:21

标签: django database-design

我的问题是我真的不知道如何根据关系数据库来设计我的设计。

我有一个类'Feat',它应该包含其他几个类,即'Stat','Skill'和'Attribute'的列表。确切的数量取决于'Feat'的实例,所以我不能只定义静态的字段数。

在普通的Python中,我只是使用列表:

class Feat():
    name
    desc
    att_effects = []
    skill_effects = []
    stat_effects = []

我尝试使用多对多关系在Django中复制它,但这并没有完全解决。

class Attribute_Name(models.Model):
    name =  models.CharField(max_length=100)
    desc = models.TextField()
    def __unicode__(self):
        return str(self.name)

...

class Attribute(models.Model):
    name = models.ForeignKey(Attribute_Name)
    value = models.IntegerField()
    def __unicode__(self):
        return "%s: %s" % (self.name, self.value)

...

class Feat(models.Model):
    name = models.CharField(max_length=100)
    desc = models.TextField()
    att_effects = models.ManyToManyField(Attribute)
    skill_effects = models.ManyToManyField(Skill)
    stat_effects = models.ManyToManyField(Stat)

使用这些模型,我可以在管理界面中创建新的'Feat'时创建新的'属性'。但是,我总是会看到所有现有的'属性',而不仅仅是那些与我的新'Feat'有关的属性。有没有办法将视图限制为仅与新的'Feat'一起创建的视图?有点像'Feat'的反向链接,它创建了'Attribute'?

基本上,当我创建或编辑'Feat'时,我应该只能使用从该实例的页面创建的属性或添加新的'Attribute'实例。我不希望'属性'属于另一个'Feat'(或其他不相关的类)出现。

请注意,我不想在'Attribute'类中添加字段,因为它也应该与其他类一起使用(例如'Character')

我也想在管理界面中这样做,因为它为我节省了相当多的工作。

相关说明:有没有办法让多对多字段为空?或者我应该创建一个神奇的“空”值并将其设置为默认值?

1 个答案:

答案 0 :(得分:1)

“有一种方法可以将视图限制为仅与新的'Feat'一起创建的视图?某些东西就像创建'属性'的'Feat'的反向链接?”

是:使用ModelAdmin as described in this question

的查询集功能