Django使用ManytoMany作为外键

时间:2014-11-03 17:33:15

标签: django foreign-keys many-to-many

我试图将多对多关系用作另一个表的外键,但我不确定这是否可行。请考虑以下模型:

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类的外键。但是,我不想这样做,因为我将拥有共享属性的协议。我更愿意制作连接表,而不是为每个协议重复属性。

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

亚历

1 个答案:

答案 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约束,所以我在创建数据库之前添加了它。