在Django的第三个模型中引用两个关联模型的最佳方法

在Django的第三个模型中引用两个关联模型的最佳方法,django,Django,我需要参考产品模型中的类别和子类别模型。但是子类别有一个外键到类别。现在,我引用如下所示。有没有更好的方法,或者这是正确的 class Category(models.Model): category_name = models.CharField(max_length=250) def __str__(self): return f'{self.category_name}' class SubCategory(models.Model): cate

我需要参考
产品
模型中的
类别
子类别
模型。但是
子类别
有一个
外键
类别
。现在,我引用如下所示。有没有更好的方法,或者这是正确的

class Category(models.Model):
    category_name = models.CharField(max_length=250)

    def __str__(self):
        return f'{self.category_name}'

class SubCategory(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    subcategory_name = models.CharField(max_length=250)

    def __str__(self):
        return f'{self.subcategory_name}'

class Product(models.Model):
    company_category = models.ForeignKey(Category, models.SET_NULL, blank=True, null=True)
    company_subcategory = models.ForeignKey(SubCategory, models.SET_NULL, blank=True, null=True)

视情况而定,
product.company\u category
可以不同于
product.company\u subcategory.category
,如果答案是肯定的,则当前设置是正确的

但是,如果这两个值总是相同的,并且您希望尽可能使表规范化,那么最好只使用
company\u子类别

规范化方法的一个警告是,每次加载
Product
的实例时,如果您想访问
Product.company\u subcategory.category
,除非使用or方法,否则将生成额外的sql查询


产品的子类别始终属于同一类别。在表单中,我应该创建一个链式下拉列表,其中首先选择类别,然后在下一个下拉列表中填充属于该类别的子类别。因此,如果使用规范化方法,我可以在表单中同时使用这两个字段吗?是的,您可以将类别字段添加到
ModelForm
中,作为
ModelChoiceField
category=forms.ModelChoiceField(category.objects.all())
,然后让前端的js根据类别字段选择过滤子类别字段。保存
ModelForm
时,将忽略类别字段,仅保存子类别。确定。知道了。如果该类别不存在,我应该给用户一个选项怎么办?这仍然有效吗?听起来这是一个类别不同于子类别的情况。类别,如果是,那么你应该继续你的初始设计。否则,如果您想在这种情况下忽略类别,但仍有子类别,则可以创建默认子类别,并在没有与该类别匹配的情况下使用它。实际上,对于这种情况,我想给用户一个选项,输入category和subcategory,然后在后端先创建category,然后创建subcategory,并将最近创建的category的id作为参考。
Product.objects.all().prefetch_related('company_subcategory', 'company_subcategory__category')
Product.objects.select_related('company_subcategory', 'company_subcategory__category').get(pk=1)