Я тоже сталкивался с этой проблемой, мой экземпляр этого был customer.number
, который был относительно клиентов Store
.У меня было соблазн использовать что-то вроде:
# Don't do this:
class Customer(models.Model):
# store = ...
number = models.IntegerField(default=0)
def save(self, *args, **kwargs):
if self.number == 0:
try:
self.number = self.store.customer_set.count() + 1
else:
self.number = 1
super(Customer, self).save(*args, **kwargs)
Выше может вызвать несколько проблем: Скажем, было 10 клиентов, и я удалил номер клиента 6. Следующий клиент, который будет добавлен, будетбыть (казалось бы) 10-м клиентом, который затем станет вторым клиентом № 10.(Это может привести к большим ошибкам в get()
наборах запросов)
То, что я закончил, было примерно таким:
class Store(models.Model):
customer_number = models.IntegerField(default=1)
class Customer(models.Model):
store = models.ForeignKey(Store)
number = models.IntegerField(default=0)
def save(self, *args, **kwargs):
if self.number == 0:
self.number = self.store.customer_number
self.store.number += 1
self.store.save()
super(Customer, self).save(*args, **kwargs)
PS:
Вы несколько раз выкинули, чтоВы хотели, чтобы это поле было заполнено " до ".Я предполагаю, что вы хотели заполнить его перед сохранением, чтобы иметь к нему доступ.На это я бы сказал: этот метод позволяет вам получить доступ к store.customer_number
, чтобы увидеть следующий номер.