我正在尝试使用多对多关系作为另一个表的外键,但我不确定这是否可能。考虑以下模型:
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(使用前将#替换为@)