2014-11-03 4 views
1

Я пытаюсь использовать многие ко многим отношений в качестве внешнего ключа для другой таблицы, но я не уверен, если это possible.Consider следующая модель:Django с использованием ManytoMany в качестве внешнего ключа

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 автоматически создаст, обрабатывая сопоставление между протоколом и атрибутами?

Возможным обходным решением может быть добавление протокола в качестве внешнего ключа к классу атрибута, а затем использование атрибута в качестве ключа для ключа к классу DeviceValue. Однако я не хочу этого делать, потому что у меня будут протоколы, которые будут делиться атрибутами. Я предпочел бы сделать таблицу соединений скорее для того, чтобы повторять атрибуты для каждого протокола.

Любые идеи будут более чем приветствуются .... спасибо !!!

Алехандро

+1

Выполняет ли 'Protocol.attributes.through' работу? –

+0

Он делает !!! Первоначально я понял, что вы не можете добавить больше внешних ключей в промежуточную таблицу, чем те, которые связаны с отношением m2m. Однако я попробовал и не жаловался. Следует учесть, что он не генерирует ограничение UNIQUE для 3 внешних ключей в файле sql, поэтому мне просто пришлось вручную добавить его. – user3851205

ответ

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 ограничение уникальности для трех иностранных ключей tablue DeviceValue не был сгенерирован, поэтому я просто добавил его перед созданием базы данных.

Смежные вопросы