我想对每个食谱进行分类,我需要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面板中选择子类别,然后自动填充其他字段(类别和主题)。我的问题是:我该怎么做?
谢谢!
答案 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实现相同的效果)