Установка значения по умолчанию поля в модели для другого экземпляра модели - PullRequest
1 голос
/ 24 февраля 2020

Модель

class SlackPermission(models.Model):
    #fields

class GithubPermission(models.Model):
    #fields

class Employee(models.Model):
    #fields
    slack_permission = models.OneToOneField(SlackPermission, on_delete=models.CASCADE, related_name='Slack',default=SlackPermission.objects.get(pk=1))
    github_permission = models.OneToOneField(GithubPermission, on_delete=models.CASCADE, related_name='Github',default=GithubPermission.objects.get(pk=1))

Ошибка:

ValueError: Cannot serialize: <GithubPermission: GithubPermission object (1)>
There are some values Django cannot serialize into migration files.

Я создаю API только для создания Employee. Там, где нет возможности давать slackpermissions и githubpermissions. Как я могу дать значение по умолчанию там?

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Проблема в том, что вы пытаетесь установить значение поля для экземпляра объекта. Таким образом, ваше значение по умолчанию должно быть только 1, если вы уверены в pk.

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

1 голос
/ 24 февраля 2020

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

Как сказал Bing, это не очень полезно делать в любом случае. Вы можете просто передать первичный ключ как значение по умолчанию. Это указано в документации по параметру default=&hellip; [Django -doc] :

Для таких полей, как ForeignKey, которые отображаются на экземпляры модели значения по умолчанию должны быть значением поля, на которое они ссылаются (pk, если не установлен to_field) вместо экземпляров модели.

Таким образом, мы можем записать это как :

class Employee(models.Model):
    full_name = models.CharField(max_length=100)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    slack_permission = models.OneToOneField(
        SlackPermission,
        on_delete=models.CASCADE,
        related_name='Slack',
        <b>default=1</b>
    )
    github_permission = models.OneToOneField(
        GithubPermission,
        on_delete=models.CASCADE,
        related_name='Github',
        <b>default=1</b>
    )

Обратите внимание, что вы должны убедиться, что существует объект с этим первичным ключом. Поэтому это может быть не идеальным.

...