Как создать фильтр для поля ForeignKey в модели Django? - PullRequest
0 голосов
/ 27 мая 2020

У меня есть модель Detail, у которой есть ForeignKey по умолчанию User Модель Django. Он работает нормально, но я хочу, чтобы ForeignKey был привязан только к тем пользователям, которые не являются ни штатными, ни суперпользователями.

Моя Detail модель ниже:

class Detail(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    subject = models.CharField(max_length=50)
    skype_session_attendance = models.FloatField(validators=[MinValueValidator(0), MaxValueValidator(20)], verbose_name="Skype Session Attendances (of this subject, in numbers)", help_text="Enter the numbers of skype sessions of this subject, the student attended out of 20.")
    internal_course_marks = models.FloatField(validators=[MinValueValidator(0), MaxValueValidator(40)], verbose_name="Internal Course Marks (of this subject, in numbers)", help_text="Enter the total internal course marks of this subject, the student obtained out of 40.")
    programming_lab_activity = models.FloatField(validators=[MinValueValidator(0), MaxValueValidator(25)], verbose_name="Programming Lab Activities (of this subject, in numbers)", help_text="Enter the total numbers of programming lab activities of this subject, the student participated in, out of 25.")
    mid_term_marks = models.FloatField(validators=[MinValueValidator(0), MaxValueValidator(45)], verbose_name="Mid_Term Marks (of this subject, in numbers)", help_text="Enter the total mid-term marks of this subject, the student obtained out of 45.")
    final_term_marks = models.FloatField(validators=[MinValueValidator(0), MaxValueValidator(90)], verbose_name="Final_Term Marks (of this subject, in numbers)", help_text="Enter the total final-term marks of this subject, the student obtained out of 90.")

    def __str__(self):
        return f'{self.user.username}-{self.subject}'

Я хочу что-то вроде ниже:

user = models.ForeignKey(User, on_delete=models.CASCADE, filter(not user.is_superuser, not user.is_staff))

Но это не работает, кто-нибудь знает, как я могу выполнить sh это?

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Есть несколько решений, одно из них.

def is_superuser(user):
    return user.is_superuser  ## customize as needed
class Detail(models.Model):
    ...
    user = models.ForeignKey(User, on_delete=models.CASCADE, validators=[is_superuser])

1 голос
/ 27 мая 2020

попробуйте использовать аргумент limit_choices_to в ForeignKey. Вы можете прочитать об этом по ссылке ниже. https://kite.com/python/docs/django.db.models.ForeignKey

Надеюсь, это поможет !!

...