2015-07-09 3 views
6

Я разработал определенное приложение, которое я нашел с указанной базой данных и схемой модели. Я использую Django версии 1.8.2. Ниже представлена ​​проблема. Ненужные поля опущены, имена моделей придуманы для примера, потому что я не могу раскрывать. Рассмотрю следующие модели A и B.Как создать первичный ключ состоит из двух полей в Django?

class B (models.Model): 

     name = models.CharField(max_length=100) 

class A (models.Model): 

     name = models.CharField(max_length=100, primary_key=True) 
     related_name = models.ForeignKey(B, null=True, blank=True) 

После долгого времени проекта, вероятность того, что там может быть несколько одноименных А, но с разным внешним ключом B. В данном конкретном случае, я хотел бы модель первичного ключа «А» состояла из двух полей: имя и родственное имя. Как создать такой ключ состоит из двух полей в django?

+0

Можно ли изменить первичный ключ 'Ā' быть Джанго по умолчанию' id' вместо этого? Это похоже на очевидное решение. –

+0

Привет :-) Спасибо за ваш ответ. Это хорошее решение, но в моем случае многие таблицы имеют в качестве таблицы внешних ключей «А», и изменение идентификатора по умолчанию будет действительно большим усилием. Более того, много кода, использующего такие запросы, как «A.objects.get (pk =« something ») и изменение типа первичного ключа, требует большой работы. По этой причине я ищу решение, которое не меняет тип ключа. База имеет много лет. –

+0

Хорошо. В этом случае я не думаю, что это можно решить в джанго. Для каждого экземпляра Django требуется единственный уникальный первичный ключ. Даже если вы можете использовать составной первичный ключ, я не уверен, что это хорошая идея, когда одно из полей в pk является нулевым внешним ключом. –

ответ

3

Вы хотите использовать составной ключ. Django не поддерживает этот See here. Существует некоторая поддержка, но у вас нет отношений, поэтому она практически ограничена практическим использованием.

Currently Django models only support a single column in this set, denying many designs where the natural primary key of a table is multiple columns. Django currently can't work with these schemas; they must instead introduce a redundant single-column key (a “surrogate” key), forcing applications to make arbitrary and otherwise-unnecessary choices about which key to use for the table in any given instance.

2

Django не поддерживает составные клавиши. Но вы могли бы использовать unique-together

unique_together = ("name", "related_name") 
+0

Когда я буду использовать unique_together, предполагая, что модели будут выглядеть как представленные в вопросе. После добавления модели метакласса A unique_together = ("name", "related_name"), я мог бы иметь две строки имени = "Kriss" для другого поля, связанного с именем? Я имею в виду, что параметр primary_key поля имени имеет значение true. –

+0

>>> s = B.objects.create (name = "JAN") >>> s.save() >>> d = A.objects.create (name = "Stasze") >>> d .save() >>> k = A.objects.create (name = "Stasze", related_name = s) return Database.Cursor.execute (self, query, params) django.db.utils.IntegrityError: UNIQUE constraint failed: test_comp_a.name –

+0

* Это не композитный ПК *, помните об этом. Вы используете атрибут 'name' в классе' A' как PK и создаете повторяющийся объект. Если у вас будет такое же 'имя' во многих объектах' A', не используйте его как PK, используйте 'autoincrement' по умолчанию, а' unique_together' будет делать трюк. – Gocht

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