Django Поле Ошибка не может разрешить ключевое слово 'is_staff - PullRequest
1 голос
/ 17 февраля 2020
Cannot resolve keyword 'is_staff' into field. Choices are: dob, experience, id,user, user_id

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

class Subscription(models.Model):
    client = models.OneToOneField(ClientProfile, on_delete=models.CASCADE)
    trainer = models.ForeignKey(TrainerProfile, null=True, blank=True,
        on_delete=models.SET_NULL, limit_choices_to={'is_staff': True})
    plan = models.ForeignKey(Plan, on_delete=models.CASCADE)
    transaction = models.OneToOneField(PaymentHistory, on_delete=models.CASCADE)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

class TrainerProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    dob = models.DateField(null=True)
    experience = models.PositiveIntegerField(default=0)

Ответы [ 2 ]

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

Вы пытаетесь получить доступ к атрибуту is_staff, которого нет в модели TrainerProfile. is_staff является атрибутом User, на который вы ссылаетесь в поле user модели TrainerProfile.

Чтобы получить доступ к этому свойству, вам необходимо "пересмотреть" отношение из Subscription -> TrainerProfile -> User. Django позволяет вам сделать это, используя двойное подчеркивание, например: some_fk_field__fk_field_attribute.

В вашем примере вам нужно изменить опцию limit_choices_to на trainer, чтобы пройти по отношению к пользователь, вот так:

class Subscription(models.Model):
    client = models.OneToOneField(ClientProfile, on_delete=models.CASCADE)
    trainer = models.ForeignKey(TrainerProfile, null=True, blank=True,
        on_delete=models.SET_NULL, <b>limit_choices_to={'user__is_staff': True}</b>)
    plan = models.ForeignKey(Plan, on_delete=models.CASCADE)
    transaction = models.OneToOneField(PaymentHistory, on_delete=models.CASCADE)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

class TrainerProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    dob = models.DateField(null=True)
    experience = models.PositiveIntegerField(default=0)
1 голос
/ 17 февраля 2020

Вы неверно ссылаетесь на вложенные отношения

class Subscription(models.Model):
    # other fields
    trainer = models.ForeignKey(TrainerProfile, null=True, blank=True,
                                on_delete=models.SET_NULL,
                                <b>limit_choices_to={'user__is_staff': True}</b>)

То есть оно должно быть user__is_staff вместо is_staff

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