我希望有人可以指出我用Django的最方式来表示以下与模型的一般关系,这样Django现有的逻辑自然会强制实现这种关系。
事物A和事物B都有许多类型之一。事物A可以与许多,一个或没有事物B相关,反之亦然(以对称方式),但是当且仅当它们共享相同类型时,事物A和事物B可以相关。
我目前的实现是有三个模型,A,B和Type,其中As和Bs有一个Type键的外键,A有一个带有B的m2m。
class A(models.Model):
b = models.ForeignKey(B)
typ = models.ManyToManyField(Type)
class B(models.Model):
a = models.ForeignKey(A)
class Type(models.Model):
name = models.CharField()
这让我可以按照自己的意愿行事,但强制执行 A不能拥有另一种类型的B的事实。我可以在我控制的视图中使用过滤逻辑,但是在我控制较少的地方,比如在Admin中,Django让我映射到不同类型的Bs。还有另一种方法来表示Django中As,Bs和Types之间的关系吗?
答案 0 :(得分:0)
这将是我的方法:
class A(models.Model):
typ = models.ManyToManyField(Type)
@property
def related2B(self)
return list of relationships
def save
check that relationship is still valid if typ field changes
class B(models.Model):
typ = models.ManyToManyField(Type)
@property
def related2A(self)
return list of relationships
def save
check that relationship is still valid if typ field changes
class Type(models.Model):
name = models.CharField()
class Relationship(models.Model):
classA = models.ForeignKey(A)
classB = models.ForeignKey(B)
def save
do check that they share a type before saving
答案 1 :(得分:0)
您是否将limit_choices_to视为控制M2M范围的方法?
复杂查询可以使用Q对象,但我猜不是F对象(对于复杂查询,包括父对象的当前状态),但是如果不合适,你仍然可以拒绝保存