我试图将多对多关系用作另一个表的外键,但我不确定这是否可行。请考虑以下模型:
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类的外键。但是,我不想这样做,因为我将拥有共享属性的协议。我更愿意制作连接表,而不是为每个协议重复属性。
任何想法都会受到欢迎....谢谢!!!
亚历
答案 0 :(得分:0)
使用中间表,我解决了它。模特就这样结束了。
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约束,所以我在创建数据库之前添加了它。