Saya mendapatkan model yang ditunjukkan di bawah ini.

Saya ingin bidang invoice_id saya mendapatkan nilai 000001 saat pengguna A mengirimkannya dan juga 000001 saat pengguna B mengirimkannya. Seharusnya otomatis meningkat dari sana, jadi jika pengguna A tetap diam tetapi pengguna B membuat pengajuan lain, B berikutnya akan mendapatkan 000002, 000003 dll. Jika pengguna C kemudian bergabung dan mengirimkan, dia juga harus mendapatkan 000001. Bagaimana saya mendekati ini?

Model saya:

class Account(AbstractBaseUser):
  email = models.EmailField(verbose_name='email', max_length=60, unique=True)
  username = models.CharField(max_length=30, unique=True)
  first_name = models.CharField(max_length=25)
  last_name = models.CharField(max_length=45)
  date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
  last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
  is_active = models.BooleanField(default=True)
  is_admin = models.BooleanField(default=False)
  is_staff = models.BooleanField(default=False)
  is_superuser = models.BooleanField(default=False)
  # Company Profile Fields
  co_logo = models.ImageField(upload_to="dashboard/logos", blank=True)
  co_name = models.CharField(max_length=45)
  co_address = models.CharField(max_length=45)
  co_zip = models.CharField(max_length=45)
  co_city = models.CharField(max_length=45)

  objects = MyAccountManager()

  USERNAME_FIELD = 'email'
  REQUIRED_FIELDS = ['username']

  def __str__(self):
    return self.email

  def has_perm(self, perm, obj=None):
    return self.is_admin

  def has_module_perms(self, app_label):
    return True


class Invoice(models.Model):
  client = models.ForeignKey(BusinessContact, default=None, on_delete=models.CASCADE)
  user = models.ForeignKey(Account, default=None, on_delete=models.CASCADE)
  invoice_id = models.CharField(unique=True, max_length=6, null=True,
                                blank=True, editable=False)
  place = models.CharField(max_length=40)
  date_created = models.DateTimeField(verbose_name='date created', auto_now_add=True)
  date_sent = models.DateTimeField(verbose_name='date sent by mail', auto_now=True)
  date_deadline = models.DateTimeField(verbose_name='payment deadline', auto_now=False)
  bank_number = models.CharField(max_length=40)
  iban_number = models.CharField(max_length=40)
  swift_bic = models.CharField(max_length=40)
  total = models.CharField(max_length=40)
  currency = models.CharField(max_length=40)
  paid_status = models.BooleanField(default=False)
  custom_comment = models.CharField(max_length=40)
  reverse_charge = models.BooleanField(default=False)

  def save(self, *args, **kwargs):
    if self.pk:
      self.invoice_id += 1
    return super(Invoice, self).save(*args, **kwargs)

  def __str__(self):
    return str(self.user) if self.user else ''
0
Jannick 22 Juli 2020, 15:39

1 menjawab

Jawaban Terbaik

Pertama-tama, Anda mendeklarasikan invoice_id Anda sebagai CharField tetapi dalam metode penyimpanan Anda, Anda meningkatkannya sebagai IntegerField. Jadi saya pikir itu harus

invoice_id = models.IntegerField(default=1, null=True, blank=True)

Anda tidak memerlukan unique namun Anda harus menangani nilai maksimal secara terpisah (periksa dokumentasi IntegerField)

Kedua, Anda tidak perlu mengganti metode save(), model Invoice Anda memiliki ForeignKey ke model Account Anda, jadi untuk setiap pengguna akan ada satu baris di Invoice tabel hanya memperbarui baris pada setiap pengiriman, misalkan

def submit(request):
    user = request.user
    try:
        invoice = Invoice.object.get(user=user)
        # already have am invoice. update it
        invoice.invoice_id += 1
        invoice.save()
    Except Invoice.DoesNotExist:
        # no invoice linked to user
        # create one
1
mursalin 22 Juli 2020, 13:03