Отношения "один ко многим" в DJANGO - как сгенерировать строку уникальности на основе 2 составных ключей
Я пытаюсь создать отношение на основе составного ключа, основанного на 2 полях для уникальности. Насколько я понимаю, Django использует внешние ключи для определения отношений один ко многим?
Вот мой сценарий:
У меня есть 2 таблицы
.
Таблица1
Таблица2
Я хочу написать код для генерации строк для записей Table3, которые итерируются по таблице 2 и генерируют список ниже и генерируют составную комбинацию клавиш:
Я хочу создать эту связь с помощью models.py, однако каждый раз, когда я сохраняю запись, ID в таблице 2 увеличивается
см. пример таблицы 2
Как я могу заставить себя вести себя так?
Вот код, который я использовал
.
Table1 - Parish i derive the value for parish.id
Таблица2 - CheckList.object.all()
Таблица3 - All_Inpection
def form_valid(self, form):
form.instance.author = self.request.user
parish = form.save(commit=False)
parish.user_id = self.request.user.id
parish.save()
entry = Company.objects.get(pk=parish.id)
Checklists = Checklist.objects.all()
for rec in Checklists:
new_rec=All_Inspection(str_status=rec.str_status, str_comment='',company_id=entry)
new_rec.save()
return super().form_valid(form)
Короткий ответ заключается в том, что - по крайней мере, сейчас - вы не можете этого сделать. Django ForeignKey
работает с первичным ключом другой таблицы, а у вас не может быть составного первичного ключа.
Более длинный ответ включает в себя несколько вариантов.
Вариант 1
Подождите, пока тикет #373 будет слит... это обеспечит функциональность композитного PK для django, и вы сможете делать то, что вам нравится.
Вариант 2
Забудьте о составных ключах. Установите индекс unique_together
в таблице, чтобы обеспечить уникальность, и используйте целочисленное или uuid ключевое поле, которое будет значением в вашем поле FK. Единственное, чего вам здесь не хватит, - это значения составного ключа в родительской таблице, потому что вместо него будет использоваться значение int/uuid.
Редактирование: после написания этой статьи я вспомнил, что unique_together
устарел в пользу UniqueConstraint
. То же самое, но если вы работаете с "современной" версией Django, вам следует использовать