基本上我有 6 个对象模型,3 个用于我的常规对象,3 个用于这些对象的依赖项。单独地,这些对象可以依赖于 3 个常规对象中每一个的一个或多个实例。
我的问题: 这是最佳做法吗?我基本上希望能够在需要时向常规对象添加新的依赖项。例如:
a = A.objects.get(id=1)
adependency = ADependencies.objects.get(dependentTo=a)
然后,我将拥有一个对象,其中包含 a
的所有依赖项。
或者,我确实想到了将3个依赖对象合并为一个的方法;但是,我不确定这是否是一种好的做法。
class Dependencies(models.Model):
id = models.CharField(max_length=16)
dependentTo = CharField(max_length=16)
a = models.ManyToManyField(A)
b = models.ManyToManyField(B)
c = models.ManyToManyField(C)
在这种情况下,我不使用 ForeignKey 来映射 dependentTo 对象。相反,我会使用对象 ID 来拉取对象——让我成为类不可知论者;但是,这需要 3 个常规对象的唯一 ID。
a = A.objects.get(id=1)
adependency = ADependencies.objects.get(dependentTo=a.id)
还有一个想法! 是否可能仍然使用 ForeignKey,但传入一个带有类名的字符串?
class Dependencies(models.Model):
id = models.CharField(max_length=16)
type = models.CharField(max_length=16)
dependentTo = ForeignKey(type)
a = models.ManyToManyField(A)
b = models.ManyToManyField(B)
c = models.ManyToManyField(C)
对象模型:
class A(models.Model):
id = models.CharField(max_length=16)
title = models.CharField(max_length=32)
summary = models.CharField(max_length=256)
class B(models.Model):
id = models.CharField(max_length=16)
title = models.CharField(max_length=32)
summary = models.CharField(max_length=256)
a = models.ForeignKey(A)
class C(models.Model):
id = models.CharField(max_length=16)
title = models.CharField(max_length=32)
summary = models.CharField(max_length=256)
b = models.ForeignKey(B)
class ADependencies(models.Model):
id = models.CharField(max_length=16)
dependentTo = models.ForeignKey(A)
a = models.ManyToManyField(A)
b = models.ManyToManyField(B)
c = models.ManyToManyField(C)
class BDependencies(models.Model):
id = models.CharField(max_length=16)
dependentTo = models.ForeignKey(B)
a = models.ManyToManyField(A)
b = models.ManyToManyField(B)
c = models.ManyToManyField(C)
class CDependencies(models.Model):
id = models.CharField(max_length=16)
dependentTo = models.ForeignKey(B)
a = models.ManyToManyField(A)
b = models.ManyToManyField(B)
c = models.ManyToManyField(C)
谢谢!
最佳答案
这可以做得更简单。定义一个 Dependency
模型而不是一个 Dependencies
模型。您将需要 contenttypes django 贡献:
from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
class Dependency(models.Model):
dependent_contenttype = models.ForeignKey(ContentType)
dependent_id = models.PositiveIntegerField()
dependent = GenericForeignKey('dependent_contenttype', 'dependent_id')
prerequisite_contenttype = models.ForeignKey(ContentType)
prerequisite_id = models.PositiveIntegerField()
prerequisite = GenericForeignKey('prerequisite_contenttype',
'prerequisite_id')
然后,如果您愿意,可以在模型 A
、B
和 C
上使依赖关系成为反向泛型关系:
class A:
# ...
dependencies = GenericRelation(
Dependency,
content_type_field='dependent_contenttype',
object_id_field='dependent_id')
关于python - 数据模型依赖,我可以简化这些对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29859128/