Django - подсчитать, сколько объектов находится в self
У меня есть очень простая модель со следующими деталями:
class ExclusiveUser(models.Model):
exclusivepass = models.CharField(max_length=4, primary_key=True, editable=False)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
date_of_birth = models.DateField(null=True)
date_of_birth = models.DateField(null=True)
age = models.IntegerField(editable=False)
def save(self,*args, **kwargs):
today = date.today()
self.exclusivepass = exclusivepass_gen(self.exclusivepass.all().count())
self.age = today.year - self.date_of_birth.year - ((today.month, today.day) < (self.date_of_birth.month, self.date_of_birth.day))
super().save(*args, **kwargs)
exclusivepass_gen
- это простой метод utils.py для генерации уникального exclusivepass
def exclusivepass_gen(pass_count):
pass_next = 0
pass_limit = 101
if pass_count < pass_limit:
pass_next = pass_count + 1
return ('E' + "{:03d}".format(pass_next))
Я пытаюсь получить количество всех объектов в таблице, чтобы передать его в exclusivepass_gen для генерации следующего числа, но получаю следующую ошибку:
'ExclusiveUser' object has no attribute 'all'
Как подсчитать все объекты в модели, чтобы передать их в метод exclusivepass_gen
?
Вы запросите базу данных в методе сохранения следующим образом:
class ExclusiveUser(models.Model):
exclusivepass = models.CharField(max_length=4, primary_key=True, editable=False)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
date_of_birth = models.DateField(null=True)
date_of_birth = models.DateField(null=True)
age = models.IntegerField(editable=False)
def save(self,*args, **kwargs):
today = date.today()
# Get qs
qs_passes = ExclusiveUser.objects.all().count()
self.exclusivepass = exclusivepass_gen(qs_passes)
self.age = today.year - self.date_of_birth.year - ((today.month, today.day) < (self.date_of_birth.month, self.date_of_birth.day))
super().save(*args, **kwargs)
Вы не можете получить количество записей в вашей базе данных, используя метод на самой модели, так как это относится только к текущему экземпляру класса, а не к вашей базе данных.
Примечание: В случае удаления записей вы можете получить дубликаты пропусков, так как подсчет может вернуть одну и ту же сумму < дважды