我该如何制定这个ForeignKey计划?

时间:2018-01-19 19:05:59

标签: django django-models foreign-keys

我在设计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()

明智的提示?

1 个答案:

答案 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
相关问题