我在设计Django模型时遇到了解决这个问题的困难。
基本设置是允许平行边缘的二分图。我们最努力地将顶点保留在一个类中,我们有什么最简洁的方法来查询入射到顶点的所有边?
保持由单个类编码的顶点的指令来自(可能是错误的)紧迫性,我必须在一个单元数据库中合并顶点。
我考虑使用继承方案,其中分区中的顶点继承自多态父Vertex
类,但我一直绊倒,并且真的开始担心Django是否有一些(未知我)本机和简洁这样做的手段。
目前的设置是:
class Vertex(models.Model):
PARTITION_CHOICES = (
('a': 'type a'),
('b': 'type b')
)
partition = models.CharField(choices=PARTITION_CHOICES)
# A bunch of other attributes...
class Edge(models.Model):
vertex_a = models.ForeignKey(Vertex, limit_choices_to={'partition': 'a'}, related_name='edges')
vertex_b = models.ForeignKey(Vertex, limit_choices_to={'partition': 'b'}, related_name='edges')
# More attributes...
这里显而易见的问题是这两个外键具有相同的相关名称,因此冲突。否则,我可以非常整洁地要求vertex.edges.all()
。
明智的提示?
答案 0 :(得分:1)
你要求智者提示,我不太明智,但我会尽我所能。
对于您的相关名称,只需将它们与字段名称相同,或完全免除它们。 What is `related_name` used for in Django?
我认为可能有更简单的方法来查询顶点的使用位置,但我能想到的唯一方法就是这样:
for edge in Edge.objects.all():
vertex_a = edge.vertex_a
vertex_b = edge.vertex_b
如果希望每条边有两个以上的顶点(或只有两个带有一个字段名),可以使用ManyToManyField。 https://docs.djangoproject.com/en/2.0/topics/db/examples/many_to_many/
class Vertex(models.Model):
PARTITION_CHOICES = (
('a': 'type a'),
('b': 'type b')
)
partition = models.CharField(choices=PARTITION_CHOICES)
# A bunch of other logic...
class Edge(models.Model):
vertcies = models.ManyToManyField(Vertex, related_name='vertices')
for edge in Edge.objects.all():
for vertex in edge.vertices.all():
# some logic