Django - 具有两个以上外键的模型

时间:2014-01-14 02:54:20

标签: django django-models django-admin

我想对每个食谱进行分类,我需要3个级别(主题 - >类别 - >子类别)。我有以下型号:

class Recipe(models.Model):
    content = HTMLField()
    ...

class Subject(models.Model):
    name = models.CharField()

class Category(models.Model):
    subject = models.ForeignKey(Subject)
    name = models.CharField()

class Subcategory(models.Model):
    category = models.ForeignKey(Category)
    name = models.CharField()

最初我在考虑将一个ForeignKey添加到Recipe模型中,例如:

subcategory = models.ForeignKey(Subcategory)

所以我可以从子类别到主题,进行简单的连接。

但也许最好创建一个新表以提高性能并拥有可扩展的系统,这是我的想法:

class Classification(models.Model):
   recipe = models.ForeignKey(Recipe)
   subject = models.ForeignKey(Subject)
   category = models.ForeignKey(Category)
   subcategory = models.ForeignKey(Subcategory)

使用最后一个解决方案,我想从Recipe admin面板中选择子类别,然后自动填充其他字段(类别和主题)。我的问题是:我该怎么做?

谢谢!

2 个答案:

答案 0 :(得分:2)

你的第一个设计实际上是最好的。这完全是denormalized database design。第二种设计有可能将您的食谱放在与您的类别无关的子类别中,与您的主题无关。因此,您在性能方面获得的收益可能会因数据完整性而丢失。

答案 1 :(得分:1)

类Subject,Category,Subcategory和Recipe(with ForeignKey)创建完全规范化的数据库设计添加Classification是非规范化数据库的一部分(例如,用于性能问题)。

回答你的问题:

recipe = Recipe.objects.get(pk=1) # just assume that you have object instance under recipe
r_subcategory = recipe.subcategory
r_category = r_subcategory.category
r_subject = r_category.subject
new_classification = Classification(subject=r_subject, category=r_category, subcategory=r_subcategory, recipe=recipe)
new_classification.save()

我真的想知道是否有办法在一个数据库请求中创建它(我可以轻松地为此生成sql请求,但我不知道如何使用Django ORM实现相同的效果)