Как вы решаете создать новую модель против поля в Django? - PullRequest
1 голос
/ 03 августа 2011

Я создаю класс профиля пользователя для моего нового веб-сайта django и пытаюсь решить, как представлять физический адрес пользователя в моих моделях.

Лучше ли создавать новый подкласс модели и ссылаться на него с помощью ключа OneToOne, например

class UserProfile(models.Model):
    ...
   address = models.OneToOneField(AddressModel)
    ...
class AddressModel(models.Model)
    street_address = models.CharField(max_length=30)
    city = models.CharField(max_length=15)
     ....

или лучше создать новое поле адреса, например

class UserProfile(models.Model):
     ...
    address = AddressField(location_dict)
     ...
class AddressField(models.Field)
    # details go here
    ...

Ответы [ 3 ]

4 голосов
/ 03 августа 2011

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

Однако, если все адреса в вашей базе данныхбудет всегда и сразу ассоциироваться с пользователем, я просто добавлю новое поле в модель.

Примечание: некоторые люди скажут вам, что неправильно и плохо иметь столбцы базы данных, которые можно обнулять, и чтопоэтому имейте отдельную модель, если любой из ваших адресов будет когда-либо None.Я не согласен;в то время как часто есть много веских причин избегать пустых столбцов, в подобных случаях я не нахожу неудобство проверки на нулевой адрес более обременительным, чем проверка существования записи модели «один к одному».

3 голосов
/ 03 августа 2011

Как сказал Илай, это вопрос независимости.В этом конкретном примере я бы сделал адрес полем UserProfile, но только если вы ожидаете, что на одного пользователя будет один адрес.Если у каждого пользователя может быть несколько адресов (например, домашний адрес и адрес для отпуска), я бы порекомендовал настроить модель с использованием ForeignKey, который моделирует отношение «многие к одному».

class UserProfile(models.Model):
    ...

class AddressModel(models.Model)
    user = models.ForeignKey(UserProfile)
    street_address = models.CharField(max_length=30)
    city = models.CharField(max_length=15)
    location = models.CharField(max_length=15) #"Home," "work," "vacation," etc.

Затем можно создать много объектов AddressModel и связать их с каждым UserProfile.

1 голос
/ 04 августа 2011

Чтобы ответить на ваш вопрос, я бы сказал, что в целом, вероятно, лучше выделить адрес, указанный другими пользователями.

Я думаю, чем больше вы узнаете о нормализации базы данных, тем легче ответить на этот вопрос.

Эта статья, Использование MySQL, нормализация , должна помочь вам разобраться в основах "форм" нормализации. Кстати, хотя он и называется MySQL, он действительно очень универсален для реляционных баз данных.

Хотя вам не всегда нужно проходить все нормальные формы для всех проектов, изучение этого действительно помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...