【发布时间】:2022-01-25 15:30:44
【问题描述】:
在我的应用程序中,我有一个名为 Supplier 的模型和多个模型,如 Part、Fuel、Ink 等,它们都是某种形式的资源供应商可能会提供。
我希望能够获取给定供应商的所有资源,并认为我可以通过制作具有两个字段的 SupplierResource 模型来有效地实现这一点:supplier 和 resource(resource 是外键到任一“资源”表中的对象)。
但这似乎不起作用,因为我无法创建映射到不同模型的外键。
以下是示例模型:
class Supplier(models.Model):
delivery_time = models.CharField(max_length=255, blank=True, null=True)
minimum_order_quantity = models.FloatField(blank=True, null=True)
billing_address = models.ForeignKey(...)
shipping_address = models.ForeignKey(...)
# ...
class Resource(models.Model):
code = models.CharField(max_length=255, unique=True, blank=True, null=True)
supplier = models.ForeignKey(
Company,
related_name="supplier_part",
on_delete=models.SET_NULL,
null=True,
blank=True,
)
country = models.CharField(max_length=255, blank=True, null=True)
class Meta:
abstract = True
class Part(Resource):
some_attr = models.CharField(max_length=255, blank=True, null=True)
class Fuel(Resource):
some_other_attr = models.CharField(max_length=255, blank=True, null=True)
我可以遍历Resource 的所有子模型以收集给定供应商的资源,但这会非常慢。
我宁愿不使用多态性来避免不必要的复杂性(除非事实证明这是绝对必要的)。
【问题讨论】:
-
您不必遍历
Resource的所有子代。您可以迭代所有Resource并查看它们是Part还是Fuel类型。无论如何,this 在你走上通用外键的道路之前是一本不错的读物 -
请问您绝对需要每个资源作为单独模型的背后原因是什么。我认为这种结构在问题的基础和根源上没有帮助。新资源会发生什么?每次都必须修改代码并添加新模型?如果我了解背景,也许用一个非常简单的解决方案来支持你会更容易。
-
资源彼此之间非常不同,并且具有许多不同的属性。因此,它们必须不同。资源必须被视为产品。你有更好的解决方案/模型结构吗?
标签: django django-models database-design