Я пытаюсь работать с моделью Django, созданной из базы данных mysql, которая имеет составные внешние ключи.Получить и установить ForeignKey прямо в Django
Мой models.py
выглядит следующим образом.
class Make(models.Model):
idmake = models.IntegerField(primary_key=True)
make = models.CharField(max_length=20L, unique=True, blank=True)
def __unicode__(self):
return self.make
class Meta:
db_table = 'make'
class Models(models.Model):
idmodels = models.IntegerField(primary_key=True, unique=True)
make = models.ForeignKey(Make, db_column='make', to_field='make')
model = models.CharField(max_length=45L, unique=True)
resource_type = models.CharField(max_length=7L)
def __unicode__(self):
return self.model
class Meta:
db_table = 'models'
class Systems(models.Model):
idsystems = models.IntegerField(primary_key=True, unique=True)
make = models.ForeignKey(Models, null=True, db_column='make', blank=True, related_name='system_make')
model = models.ForeignKey(Models, null=True, db_column='model', to_field = 'model', blank=True, related_name='system_model')
serial_num = models.CharField(max_length=45L, blank=True)
service_tag = models.CharField(max_length=45L, blank=True)
mac = models.CharField(max_length=45L, unique=True)
Теперь, когда я пытаюсь получить доступ к make
поле системы я получаю ValueError
.
>>> s = Systems.objects.get(pk=1)
>>> s.model
<Models: model11>
>>> s.model.make
<Make: make1>
>>> s.make
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/django/db/models/fields/related.py", line 384, in __get__
rel_obj = qs.get(**params)
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 395, in get
clone = self.filter(*args, **kwargs)
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 669, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 687, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1271, in add_q
can_reuse=used_aliases, force_having=force_having)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1202, in add_filter
connector)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/where.py", line 71, in add
value = obj.prepare(lookup_type, value)
File "/usr/lib/python2.7/site-packages/django/db/models/sql/where.py", line 339, in prepare
return self.field.get_prep_lookup(lookup_type, value)
File "/usr/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 1003, in get_prep_lookup
return super(IntegerField, self).get_prep_lookup(lookup_type, value)
File "/usr/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 322, in get_prep_lookup
return self.get_prep_value(value)
File "/usr/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 997, in get_prep_value
return int(value)
ValueError: invalid literal for int() with base 10: 'make1'
Мне не разрешено изменять таблицы и отношения в базе данных. Я очень новичок в Django, и я не могу понять, что является правильным решением для этой проблемы. В принципе, я хотел бы иметь возможность получить и установить поле make
модели Systems
. Может ли кто-нибудь направить меня на то, как я должен это делать? Мои первоначальные мысли заключались в том, что мне нужно было создать настраиваемое поле ForeignKey
.
Спасибо за ваш ответ @ZZY. Я не совсем понимаю, что вы подразумеваете под «Модели», как предполагается, «Make»? В таблице 'Models' поле' make' является внешним ключом и связано с полем 'make' таблицы' Make'. В 'System.make' у меня не может быть' to_field = 'make'', потому что 'make' не уникален в' Models'. В 'Модели',' make' и 'model' уникальны вместе. – Sanket
Я думал, что 'System.make' на самом деле указывает на модель' Make' – ZZY
Если вам нужно «make» и «model» уникально вместе, в 'class Meta', определите' unique_together = («make», «model») '. [Doc] (https://docs.djangoproject.com/en/1.7/ref/models/options/#unique-together) – ZZY