Django Как заставить ForeignKey использовать по умолчанию? - PullRequest
1 голос
/ 27 февраля 2011

У меня проблема с получением значения параметра ForeignKey по умолчанию равным нулю, он продолжает сообщать мне, что поле является обязательным, или, если я попробую другую итерацию, он будет жаловаться, что поле не может быть пустым.

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

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

Все отношения работают, однако мои заявления ForeignKey не позволяют мне использовать значение по умолчанию 0 (ноль).

# relationships
# Only the company field should be required, the others are optional
# This is so you can link a company with either a sponsor OR a worker
#
sponsor     = models.ForeignKey('Sponsor', null=True, default=0, blank=False)
company     = models.ForeignKey('Company')
worker      = models.ForeignKey('Worker', null=False, default=0, blank=False)

# possible future relationships (not implemented)
#suppliers       = models.ForeignKey('Supplier', null=True, default=0, blank=False)

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

Идея состоит в том, чтобы иметь 1 таблицу для управления / управления всеми контрактами между различными организациями..

Pseduocode

Контракты;id = 1 |company_id = 1 |спонсор_ид = 0 |worker_id = 1 |длина = 10 |salary = 10000

// etc

Я пробовал следующие итерации.

# models.ForeignKey('Sponsor', null=False, default=0, blank=True) # This makes the field required

# models.ForeignKey('Sponsor', null=True, default=0, blank=True) # This complains that "Contracts.sponsor" does not allow null values. 

Любые указатели о том, как заставить ForeignKey использовать значение по умолчаниюбудет принята с благодарностью.

Большое спасибо.

Редактировать.Добавление кода, вызывающего ошибки;Это урезанная версия кода.

// company.py
class Company(models.Model):
    """(Company description)"""

    sponsorContracts = models.ManyToManyField('Sponsor', through='Contracts', db_column='sponsor_id')
    employees   = models.ManyToManyField('Worker', through='Contracts', db_column='worker_id')

// contracts.py
class Contracts(models.Model):
    """(Contracts description)"""
        # relationships
    sponsor             = models.ForeignKey('Sponsor', null=True, default=0, blank=True)
    company             = models.ForeignKey('Company')
    worker              = models.ForeignKey('Worker', null=False, default=0, blank=False)

// worker.py
class Worker(models.Model):
    """(A list of employees)"""

    employer            = models.ManyToManyField('Company', through='Contracts', db_column='company_id')


// sponsor.py
class Sponsor(models.Model):
    """(A list of sponsors)"""

    sponsorContracts    = models.ManyToManyField('Company', through='SponsorContracts')

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011

Связь между сущностями либо существует (допустимая ссылка на id в другой таблице), либо нет (значение undefined - null). Если вам действительно «нужно» ненулевое значение, которое не ссылается на действительную сущность, вы можете попробовать определить сущность «по умолчанию», определенную в указанной таблице, и определить для нее значение по умолчанию.

В большинстве случаев я бы поставил под сомнение обоснованность требования ненулевого значения FK по умолчанию. Хотя я сделал нечто подобное в одном или двух случаях:

User(id, username, gender_id)
Gender(id, value)

Gender:
id 1 value unknown
id 2 value male
id 3 value female

Действительно, null известен как значение undefined и должно использоваться как таковое в большинстве случаев.

2 голосов
/ 27 февраля 2011

Как ForeignKey по умолчанию может быть 0? Весь смысл FK заключается в том, что он ограничен значениями ключа в другой таблице. В этой таблице не может быть строки с идентификатором 0, поэтому 0 не является допустимым значением для FK.

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

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