Пользователь изменяет поле только для себя в Django

#python #python-3.x #django

Вопрос:

Я в некотором роде новичок в Django и в настоящее время борюсь с определенным его аспектом. В моем проекте я хочу, чтобы все пользователи имели доступ к определенным Job сайтам, добавленным администратором, и отображались на интерфейсе. Однако у каждого Job есть поле под названием userStatus , которое пользователь должен иметь возможность редактировать. Однако это поле не должно изменяться для других пользователей. В настоящее время я создал модель userStatus и создал поле внешнего ключа для ссылки на a Job . Затем userStatus имеет User поле внешнего ключа.

 class Job(models.Model):
    name = models.CharField(max_length=200, help_text='Enter the Spring/Internship')
    course = models.ForeignKey('Course', on_delete=models.RESTRICT,null=True)
    company = models.ForeignKey('Company', on_delete=models.RESTRICT,default='N/A')
    deadline = models.DateField(null=True, blank=True)
    userStatus = models.ForeignKey('userStatus', on_delete=models.RESTRICT, null=True, blank=True)

class userStatus(models.Model):
    user = models.ForeignKey(User, on_delete=models.RESTRICT)

    USER_STATUS = (
        ('n', 'Not Applied'),
        ('a', 'Applied'),
        ('i', 'Got Interview'),
        ('o', 'Got Offer'),
        ('r', 'Rejected'),
    )

    stage = models.CharField(
        primary_key=True,
        max_length=1,
        choices=USER_STATUS,
        blank=False,
        default='c',
        help_text='What is the current stage of the process',
    )
 

Пользователь не должен иметь возможности редактировать какое-либо поле, кроме userStatus того, которое должно принадлежать только ему. Кортеж USER_STATUS должен быть единственным вариантом для этой модели, и каждый Job должен иметь доступ к этим 5 вариантам. В контексте:
Одна работа может называться «Стажировка в Google», один пользователь может «Пройти собеседование» на эту работу, но другой пользователь «Не подал заявку». Этот второй пользователь может подать заявку и хочет изменить свой статус на «Подано». Если они это сделают, это не должно повлиять на статус первого пользователя «Получил интервью».

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

Ответ №1:

Вы определили userStatus в Job модели, поэтому у одного конкретного Job может быть ноль или один userStatus , а у одного userStatus может быть много Jobs .

Связь между этими двумя моделями должна работать в противоположном направлении.

Таким образом, код должен быть следующим:

 class Job(models.Model):
    name = models.CharField(max_length=200, help_text='Enter the Spring/Internship')
    course = models.ForeignKey('Course', on_delete=models.RESTRICT,null=True)
    company = models.ForeignKey('Company', on_delete=models.RESTRICT,default='N/A')
    deadline = models.DateField(null=True, blank=True)


class UserStatus(models.Model):
    user = models.ForeignKey(User, on_delete=models.RESTRICT)
    job = models.ForeignKey(Job, on_delete=models.RESTRICT)

    USER_STATUS = (
        ('n', 'Not Applied'),
        ('a', 'Applied'),
        ('i', 'Got Interview'),
        ('o', 'Got Offer'),
        ('r', 'Rejected'),
    )

    stage = models.CharField(
        primary_key=True,
        max_length=1,
        choices=USER_STATUS,
        blank=False,
        default='c',
        help_text='What is the current stage of the process',
    )
 

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