Разрешение трехсторонней циклической ссылки в SQL (Django) - PullRequest
2 голосов
/ 03 марта 2012

В настоящее время у меня есть три модели в Django, которые создают круговую ссылку:

A User может жить в Location.Location должен быть частью PropertyProperty должен быть владелец, а это User.

. Причина, по которой я хочу, чтобы каждый User указывал местоположение, предназначена для людей, живущих в квартирах.Квартирный арендатор будет жить в номерной комнате, а домашний - нет.Но обратите внимание, что местоположение также может быть просто собственностью (т. Е. Арендатор дома живет в месте, которое является просто собственностью с адресом; у собственности нет номеров, этажей или зданий.).

Вот (урезанный) код:

class User( models.Model ) :
    TYPE_CHOICES = (
        ( 't', 'tenant'           ),
        ( 'o', 'property owner'   ),
        ( 'v', 'vendor'           ),
        ( 'm', 'property manager' ),
    )

    user_type  = models.CharField( max_length = 1, choices = TYPE_CHOICES, default = 't' )
    first_name = models.CharField( max_length = 135 )
    last_name  = models.CharField( max_length = 135 )
    location   = models.ForeignKey( Location, null = True, blank = True )

class Property( models.Model ) :
    name             = models.CharField( max_length = 135 )
    owner            = models.ForeignKey( User )
    address_line_one = models.CharField( max_length = 135 )
    address_line_two = models.CharField( max_length = 135, blank = True )
    city             = models.CharField( max_length = 135 )
    state            = models.CharField( max_length = 135 )
    zip_code         = models.CharField( max_length = 135 )

class Location( models.Model ) :
    room       = models.CharField( max_length = 135, blank = True )
    floor      = models.CharField( max_length = 135, blank = True )
    building   = models.CharField( max_length = 135, blank = True )
    prop       = models.ForeignKey( Property )

Пожалуйста, дайте мне знать, если вам, ребята, нужно больше разъяснений или кода.Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 03 марта 2012

Как и в документах , например, вы можете использовать строку, чтобы указать приложение и модель для использования в отношении.

Если вам нужно создать связь на модели, которая еще не была определена, вы можете использовать имя модели, а не сам объект модели

1 голос
/ 03 марта 2012

Круговые пути в ссылках таблиц могут привести к серьезным проблемам, которые можно решить с помощью хитрых и громоздких решений (и не все такие решения работают во всех СУБД).

Если вы хотите их избежать, выследует перепроектировать таблицы.Возможным способом является удаление User -> Location внешнего ключа (это единственный, который не является обязательным, по вашим словам: "Пользователь может жить в местоположении" , другое использование "must" ) и создайте отдельную таблицу для этого (необязательного) отношения.

class User( models.Model ) :
    TYPE_CHOICES = (
        ( 't', 'tenant'           ),
        ( 'o', 'property owner'   ),
        ( 'v', 'vendor'           ),
        ( 'm', 'property manager' ),
    )

    user_type  = models.CharField( max_length = 1
                                 , choices = TYPE_CHOICES, default = 't' )
    first_name = models.CharField( max_length = 135 )
    last_name  = models.CharField( max_length = 135 )

class UserLocation( models.Model ) :
    person          = models.ForeignKey( User )
    person.unique   = True 
    apartm_location = models.ForeignKey( Location )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...