【问题标题】:Django Model: Multiple foreign keys or one to one fieldDjango 模型:多个外键或一对一字段
【发布时间】:2016-03-13 21:19:50
【问题描述】:

我对 django 模型中的关系概念有疑问。

让我们看看我的例子:

我把这个表/类放到models.py中:

class PacketEventsInformation(models.Model):

ID_IP_Source = models.<Relationship>(Ips, on_delete=models.CASCADE)
ID_IP_Dest = models.<Relationship>(Ips, on_delete=models.CASCADE)
ID_Source_Port = models.<Relationship>(Ports, on_delete=models.CASCADE)
ID_Dest_Port = models.<Relationship>(Ports, on_delete=models.CASCADE)
Protocol = models.CharField(max_length=20)
ID_Source_MAC = models.<Relationship>(Macs, on_delete=models.CASCADE)
ID_Dest_MAC = models.<Relationship>(Macs, on_delete=models.CASCADE)
RAW_Info = models.TextField()
TAG = models.ForeignKey(Tags, on_delete=models.CASCADE)

def __str__(self):
    return '%s' % self.id

此时,我定义了我所有的 ID 字段与另一个表/类 (Pkey) 的 ID 字段之间的关系,例如 ForeignKey。

好吧,如果我执行迁移到我的终端,我会得到这个:

./manage.py migrate 
app.PacketEventsInformation.ID_Dest_MAC: (fields.E304) Reverse accessor for 'PacketEventsInformation.ID_Dest_MAC' clashes with reverse accessor for 'PacketEventsInformation.ID_Source_MAC'.
......

我了解ManyToMany、OneToOne和OnetoMany(外键)的定义,但我不知道为什么不能这样做。也许答案可能是使用该 Fkeys 创建中间表或在该 ids 之间放置 OneToOne 关系....

感谢您的回答 =)

警察局:

ID_IP_Source/Dest 可以相同

ID_Source/Dest_Port 可以相同

ID_Source/Dest_MAC 可以相同

【问题讨论】:

    标签: python django sqlite foreign-keys django-orm


    【解决方案1】:

    django中当有多个外键指向同一个模型时,需要用related_name区分:

    ID_IP_Source = models.<Relationship>(Ips, on_delete=models.CASCADE, related_name="id_ip_source")
    ID_IP_Dest = models.<Relationship>(Ips, on_delete=models.CASCADE, related_name="id_ip_dest")
    

    【讨论】:

    • 其实中间表只用于ManyToManyField。不适用于 ForeignKey 或 OneToOneField。
    • @JoeyWilhelm 是的,我搞砸了这个概念。更新了答案。
    • 在 16 秒内!伟大的! =) 非常感谢你。但另一个问题是,执行迁移后我没有看到中间表进入数据库。那么,django 在内部使用它还是如何使用它?如果你知道怎么做:P
    • 抱歉我最初的误导性答案,我编辑了它。 Joey 指出只有 m2m 字段会有中间模型,所以我最初的陈述只对 m2m 关系有效。
    • @ShangWang 好的,我明白了 =) 谢谢!
    猜你喜欢
    • 2017-06-01
    • 2020-06-19
    • 2010-10-18
    • 2012-05-20
    • 1970-01-01
    • 2019-09-15
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多