2014-08-28 2 views
0

Im испытывающей трудности понимания того, что является целью 12:59 отношениймодель Django, понимание один на один отношения

У меня есть форма, где заполнить пользователь информации, и выберите тип выгоды.

К примеру, у меня есть модель

class BenefitRequest(models.Model): 
    benefitType = models.OneToOneField(BenefitType) 
    description = models.CharField(max_length=100) 
    benefitAccount = models.ForeignKey(BenefitsAccount 

class BenefitType(models.Model): 
    benefit = models.CharField(max_length=25) 

В моей базе данных, для BenefitType, я коммутируют, Фитнес и эргономики

Однако, когда я заполнить форму и выбрать " Fitness "для PersonA и отправьте форму, затем снова выберите« Фитнес »для PersonB и отправьте ее снова, это дает мне сообщение о том, что мой BenefitType уже используется. Хотя это новый запрос для другого пользователя.

Означает ли это, что в django отношение один к одному - это где таблица может иметь только один тип каждой другой таблицы?

ответ

3

Это правильно. Это не уникально для Django; отношение один к одному означает, что каждая строка в одной таблице базы данных привязана к одной и только одна другая строка в другой таблице. В взаимно однозначной зависимости между таблицей X и таблицей с именем Y каждая строка в X связана с строкой в ​​Y.

Для взаимно-однозначных полей (в Django в вашем случае) у вас есть это одно поле со значением, связанным с другим полем. Примеры документа Django относятся к ресторану с адресом. Это должно сделать отношения понятными: в ресторане есть один адрес (запрет на некоторые редкие исключения в реальном мире, где у здания может быть более одного адреса, связанного с ним.)

Предлагаю ознакомиться с соответствующей документацией для более тщательного Объяснение: https://docs.djangoproject.com/en/dev/topics/db/examples/one_to_one/

Если вы хотите, чтобы ваши «Типы преимуществ» были доступны нескольким пользователям, вы можете вместо этого рассмотреть отношения «много-к-одному».

1

Кажется, что вы действительно хотите, это не OneToOneField, а похоже на ForeignKey. Если вам нужна связь «один ко многим» между вашей моделью, то, например, BenefitRequest может использовать любой ваш тип вашего преимущества. Вам нужен ForeignKey для BenefitType. Тогда вы можете создать любое BenefitRequest и выбрать любой BenefitType любое количество раз:

benefitType = models.ForeignKey(BenefitType) 

Один способ думать поля OneToOne является то, что они могут очень хорошо относятся к одной и той же модели (или таблицы базы данных), они же «запись» действительно, разделенная из-за некоторых «ограничений». Например, пытаясь повторно использовать User из django.contrib.auth и зная, что вы не можете просто расширить модель, не нарушая работу других частей приложения.

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