2014-06-09 3 views
2

Я много читал о Django и, наконец, начал разрабатывать модели для проекта, который я изложил, но мне сложно понять ForeignKeys и как/когда их использовать. Я немного прочитал о работе с базами данных, чтобы лучше понять внешние ключи в целом, но без предварительного опыта работы с базами данных я все еще немного смущен.Должен ли я использовать ForeignKey в этой модели Django?

Я придумал пример ситуации, аналогичный проекту, над которым я работаю, и хотел бы знать, являются ли оба использования ForeignKey правильными, или я должен использовать OneToOneField или ManyToManyField вместо них.

В этой примерной ситуации я хотел бы, чтобы каждый мост имел несколько строителей, и каждый инструмент имел несколько разных пользователей (или строителей, которые были с ними опытными). Я бы не хотел, чтобы строитель работал на нескольких мостах одновременно (OneToOne ??). Тем не менее, я хотел бы, чтобы каждый строитель имел возможность иметь несколько инструментов, которыми они обладают (ManyToMany ??).

class Builder(models.Model): 
     first_name = models.CharField(max_length = 50) 

    class Bridge(models.Model): 
     bridge_name = models.CharField(max_length = 50) 
     builders = models.ForeignKey(Builder) 

    class Tool(models.Model): 
     tool_name = models.CharField(max_length = 50) 
     users = models.ForeignKey(Builder) 

Из моего понимания, я могу получить все инструменты, оборудование строителей в views.py файла, хотя я еще не дошел до этой части развития еще, и хотел бы, чтобы обеспечить меня сильный модель, прежде чем дойти до этого.

Учитывая, как родовое и открытого состава этот вопрос может быть, в целом, я бы так же, как кто-то объяснить:

WHY each ForeignKey relationship in this example 
model is either used correctly or incorrectly. 

ответ

0

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

1 Мост может иметь много рабочих ((мост) < - * Многие (работник), ForeignKey)

1 Мост может иметь 1 работника (One (Bridge) < - -> Один (работник), один к одному полю)

многие мосты могут иметь много рабочих (много (Bridges) * - * многие (рабочие), многие ко многим поля)

Если вы используете ForeignKey от инструментов до строителей, это означает, что у рабочего может быть много инструментов, но каждый инструмент уникален для рабочего, если у вас много для многих тогда любой рабочий может иметь любой инструмент. Если вам нужны инструменты, которые могут принадлежать многим различным работникам, тогда вам нужно много-много отношений, если инструменты нуждаются в определенных ограничениях (например, умениях), а затем снова во многих отношениях с конкретными ограничениями (через таблицу может содержаться дополнительная информация в отношении ассоциации, подобно тому, как работник 1 использует инструмент 1 каждую пятницу, это будет сквозная таблица работников инструментам с средней таблицей, в которой рабочий использует конкретный инструмент).

+0

Если вы укажете внешний мост в мосту, вы на самом деле говорите, что мост принадлежит рабочему, а рабочий может иметь много разных мостов, если вы укажете в рабочем месте дополнительный ключ, то это означает, что рабочий имеет мост, но на мосту может быть много рабочих. Представьте, что это выпадающий список, если вы добавите отношение в рабочую модель, тогда вы выбираете для конкретного работника мост (в выпадающем списке), если вы укажете его наоборот, вы выбираете работника для моста. – petkostas

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