Джанго Модель Дизайн - PullRequest
       6

Джанго Модель Дизайн

0 голосов
/ 21 января 2010

Ранее я задавал вопросы для этого проекта, касающиеся администратора Django, Inlines, Generics и т. Д. Еще раз спасибо людям, которые предоставили ответы на эти вопросы. Для справки, эти вопросы здесь:

Django - Проектирование отношений модели - Интерфейс администратора и Inline

Общие отношения Django с администратором Django

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

У нас есть приложение Django с несколькими объектами - Пользователи (у которых есть Профиль пользователя), Больницы, Отделы, Учреждения (то есть Учебные заведения) - у всех из которых есть несколько адресов (или нет адресов). Вполне вероятно, что многие из них будут иметь несколько адресов.

Также возможно, что несколько объектов могут иметь один и тот же адрес, но это редко, и я рад иметь дублирование для тех случаев, когда это происходит.

В настоящее время модель:

class Address(models.Model):
    street_address = models.CharField(max_length=50)
    suburb = models.CharField(max_length=20)
    state = models.CharField(max_length=3, choices=AUSTRALIAN_STATES_CHOICES)
    ...
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()
    ...
class Hospital(models.Model):
    name = models.CharField(max_length=20)
    address = generic.GenericRelation(Address)
    ...
class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    address = generic.GenericRelation(Address)
    ...

Во-первых - правильно ли я делаю, с полем FK для каждого объекта, который имеет адрес (а)?

Во-вторых, есть ли лучшая альтернатива использованию Родовых Отношений для этого случая, когда все объекты имеют адреса? В другом посте кто-то упомянул об использовании абстрактных классов - я думал об этом, но там, кажется, есть небольшое дублирование, поскольку модель адресов в основном одинакова для всех.

Кроме того, мы будем активно использовать администратора Django, поэтому он должен работать с этим, предпочтительно также с адресом в виде строк (вот где я столкнулся с проблемой - поскольку я использовал общие отношения, администратор Django был ожидал что-то в полях content_type и object_id и выдавал ошибку, когда они были пустыми, вместо того, чтобы что-то искать).

Ура, Victor

1 Ответ

0 голосов
/ 21 января 2010

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

class Addressable(models.Model):
  ...   # common attributes to all addressable objects

class Hospital(Addressable):
  name = models.CharField(max_length=20)
  ...

class UserProfile(models.Model):
  user = models.ForeignKey(User, unique=True)

class Address(models.Model):
  street_address = models.CharField(max_length=50)
  suburb = models.CharField(max_length=20)
  state = models.CharField(max_length=3, choices=AUSTRALIAN_STATES_CHOICES)
  ...
  owner = models.ForeignKey(Addressable)

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

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