как создать уникальный идентификатор для каждого отдела в модели django - PullRequest
0 голосов
/ 14 апреля 2020

я создал модель в django для информации о студентах

<!-- language: python -->
class student(models.Model):
    department_choices=(('cse','cse'),('mech','mech'),('EEE','EE'))
    name=models.CharField(max_length=35)
    department=models.CharField(max_length=30,choices=department_choices)

я хочу, чтобы идентификатор генерировался уникальным для отдела, например, если я выбрал cse, идентификатор отдела должен быть cse0001, cse002 или если mech означает идентификатор должен быть mech001, mech002 что мне делать

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Я бы рекомендовал сначала иметь модель Department, но если вам действительно нужно это для модели Student. Я бы добавил дополнительное поле в вашу модель, а затем заполнил его, когда модель сохранится. Таким образом, вы можете гарантировать уникальность и использовать ее в любой ORM-фильтрации или других операциях:


class Student(models.Model):
    department_choices = (('cse', 'cse'), ('mech', 'mech'), ('EEE', 'EE'))
    name = models.CharField(max_length=35)
    department = models.CharField(max_length=30, choices=department_choices)
    department_id = models.CharField(max_length=20, unique=True)

    def save(self, *args, **kwargs):
        # check here for PK, PK will only be populated if save()
        # has already been called before, so this means the
        # department_id field will only be set when the model is created
        # remove this condition if you want it regenerated after every save() call.
        if not self.pk:
            self.department_id = f"{self.department}{self.pk}"

        super().save(*args, **kwargs)

Теперь, IntegrityError будет брошено, если вы попытаетесь создать студента с существующим department_id как мы можем обеспечить уникальность с помощью аргумента unique=True в поле department_id.

0 голосов
/ 14 апреля 2020

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

class Student(models.Model):
    DEPARTMENT_CHOICES=(('cse','cse'),('mech','mech'),('EEE','EE'))   

    name=models.CharField(max_length=35)
    department=models.CharField(max_length=30,choices=DEPARTMENT_CHOICES)

    def department_id(self):
        return f"{self.department}{self.id}"

Это добавит первичный ключ Student к строке отдела.

Вы можете использовать это в ваших шаблонах вот так.

<ul class="student">
  <li>Name: {{ a_student.name }}</li>
  <li>Dep ID: {{ a_student.department_id }}</li>
</ul>

Если вам нужно отобразить это в Django admin, вы можете добавить к вышеуказанному методу department_id, как этот.

def department_id(self):
    return f"{self.department}{self.id}"

department_id.short_description = "Department ID"

Теперь вы можете использовать department_id в качестве поля только для чтения в Django admin.

Наконец, если вы хотите, чтобы идентификатор имел начальные нули, вы можете использовать zfill().

def department_id(self):
    return f"{self.department}{str(self.id).zfill(4)}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...