Django 使用 ManytoMany 作为外键

2024-03-23

我正在尝试使用多对多关系作为另一个表的外键,但我不确定这是否可能。考虑以下模型:

from django.db import models

class Attribute(models.Model):
    name=models.CharField(max_length=30)
    unit=models.CharField(max_length=30)

class Protocol(models.Model):
    name=models.CharField(max_length=30)
    attributes=models.ManyToManyField(Attribute,db_table='protocol_attribute')

class Device(models.Model):
    serial_number = models.CharField(max_length=30)
    id_protocol=models.ForeignKey(Protocol)

class DeviceValues(models.Model):
    id_device=models.ForeignKey(Device)
    id_protocol_attribute=models.ForeignKey(Protocol.attributes)
    value=models.IntegerField()

当我尝试验证此模型时,我收到以下错误:

First parameter to ForeignKey must be either a model, a model name, or the string 'self'

我知道我没有使用模型或模型名称作为第一个参数,但是如何将 Django 将自动创建的用于处理协议和属性之间映射的连接表引用为外键?

可能的解决方法是将协议作为外键添加到 Attribute 类,然后使用该属性作为 DeviceValue 类的外键。但是,我不想这样做,因为我将拥有共享属性的协议。我更愿意制作连接表而不是为每个协议重复属性。

任何想法都将受到欢迎......谢谢!

亚历杭德罗


使用中间表,我解决了这个问题。模型最终是这样的。

from django.db import models

class Attribute(models.Model):
   name=models.CharField(max_length=30)
   unit=models.CharField(max_length=30)

class Protocol(models.Model):
   name=models.CharField(max_length=30)
   attributes=models.ManyToManyField(Attribute,through='DeviceValue')

class Device(models.Model):
   serial_number = models.CharField(max_length=30)
   id_protocol=models.ForeignKey(Protocol)

class DeviceValue(models.Model):
   id_name=models.ForeignKey(Protocol)
   id_attribute=models.ForeignKey(Attribute)
   id_device=models.ForeignKey(Device)
   value=models.IntegerField()

值得一提的是,使用 sqlall 时,并未生成 DeviceValue tablue 的三个外键的 UNIQUE 约束,因此我只是在创建数据库之前添加了它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 使用 ManytoMany 作为外键 的相关文章

随机推荐

  • 尝试在现有的flutter应用程序中实现flutter_contacts示例

    我正在尝试实现这里的 flutter contacts 示例 颤动接触 https github com pavelshackih flutter contacts blob master android app src main kotl
  • 如何在 django DRF 中处理时区而不重复太多?

    Intro 我的项 目TIME ZONE等于 UTC 而我的用户来自太多时区 所以 当我用户 makePOST or PUT with date or time or dateTime字段我将这些字段转换为UTC before serial
  • 将 FirestoreCollection 转换为数组?

    我在将 Firestore 数据转换为 Chart js 图表的数组时遇到困难 从 Firestore 获取数据 fetchData Get data this updatesCollection this afs collection p
  • 如何为多个 #id 创建 ::before

    是否可以在前面插入多个id I have ps4 before ps3 before 我尝试过 ps4 ps3 before但什么也没有 是否可以在之前插入更多 id 我想保持CSS尽可能干净和简短 我尝试查看 css trick 但找不到
  • 采用 OpenGL 中的 Wu 算法的数字微分分析仪

    我正在尝试制作一种使用 DDA 数字差分分析器 绘制线条的算法 该算法也使用 Wu 的算法作为抗锯齿 问题是输出看起来不太好 尤其 我选择的颜色 它改变了 我知道为什么 但我想知道它是否必须是这样的 像素颜色越亮则越亮 我怎样才能选择我想要
  • 从数据框中仅提取数字列[重复]

    这个问题在这里已经有答案了 我在互联网上查找 但没有找到简单而干净的解决方案 这是我的 df 的一部分 structure list ID structure c 12L 12L 12L 12L 12L 12L 12L 12L 12L 12
  • 缺少 1 个必需的位置参数:“key”

    class Keys def init self self key list 1 one 2 two 3 three def get name self key self ddd key key1 Keys key1 get name 1
  • React Native 导航显示白屏

    使用反应本机导航进行编译时出现白屏 请问为什么会这样 我似乎没有收到任何错误代码 什么也没有 我只看到一个白屏 为什么会这样呢 我的代码看起来像这样 表明到目前为止我似乎没有任何错误 Here is what the Error seems
  • 断言代码无法编译

    简而言之 如何编写一个测试 检查我的类不可复制或可复制分配 而只能移动和移动分配 一般来说 如何编写测试 确保特定代码does not编译 像这样 Movable but non copyable class struct A A cons
  • 如何在 @ElementCollection 上指定主键

    因此 如果某些表缺少主键 innodb 的行为可能会导致问题 因此 在 Hibernate 中 我正在寻找一个键来指定 ElementCollection 表上的主键 并将 Set 作为底层数据结构 我找到了一种带有地图的主键的方法 但这有
  • PHP,preg_replace,用标签属性替换标签

    我可以详细解释一下如何使用 php 替换具有当前 attr 的标记吗 我阅读了手册和一些参考资料 如何使用php preg replace替换HTML标签 https stackoverflow com questions 3376051
  • 不允许序列化“Doctrine\DBAL\Driver\PDOConnection”

    我正在做一个项目 我做了一个可导出的课程 这是班级 我正在发送查询以导出类型 Illuminate Database Eloquent Builder
  • 检查是否已经过去 24 小时(从字符串中读取)

    我将日期作为字符串保存在以下格式的文件中 Sat Jul 21 23 31 55 EDT 2012 如何查看是否已经过了 24 小时 我是初学者 所以请解释一下 我不确定我是否完全理解这个问题 您是否有两个日期可供比较 或者您是否希望定期检
  • 在 Jenkins 中设置特定的 Python

    我对配置 Jenkins 或 Python 很陌生 但我必须在 Jenkins 中设置统一测试 我的程序是用Python编写的 但仅适用于Python 2 6 而我应该使用的Jenkins版本是2 7 所以我尝试设置Jenkins来设置一些
  • 将可变数量的变量传递给 PHP 中的类

    我需要传递可变数量的字符串来实例化不同的类 我总是可以对数组的大小进行切换 switch count a case 1 new Class a 0 break case 2 new Class a 0 a 1 break etc 必须有更好
  • Prolog 中的掩码

    我最近一直在尝试理解 Prolog 并且一直在搞乱 Prolog 中的列表列表 我正在尝试创建一种我想在 p 中的面具 序言 我有一个谓词 它确定 Prolog 中两个列表列表 比如说 L1 和 L2 之间的差异 并将它们保存为列表列表 比
  • 如何测试是否支持稀疏文件

    给定文件描述符或文件名 我如何知道是否可以写入任意位置 而无需等待磁盘上的中间部分被显式清零 You can stat 文件获取文件大小和磁盘块数量 在文件末尾查找相对较少数量的磁盘块 写入已知数量的块 然后再次统计文件 将磁盘块的原始数量
  • 移动提供商无法进行 UDP 打洞

    实际上 我正在编写一个 Android 应用程序 该应用程序接收连接到 PC 的网络摄像头的图片 为了获得更多的 fps 我使用 udp 协议而不是 tcp 这个想法是 电脑将图片发送到手机的 IP 和端口 但电话提供商有不同的公共端口 所
  • 在 iOS 中检索通过蓝牙连接的配对设备

    我已连接条形码扫描仪设备 条码扫描仪信息 http www barcodedatalink com pages product details php p 108 我想知道它的配对状态 是否与设备连接 void centralManager
  • Django 使用 ManytoMany 作为外键

    我正在尝试使用多对多关系作为另一个表的外键 但我不确定这是否可能 考虑以下模型 from django db import models class Attribute models Model name models CharField