Django, пользовательские поля с автоматическим увеличением символов

Я новичок в Django, с этим методом я хочу настроить его на генерацию кода элемента в качестве первичного ключа, вот так:

PC.202202.001

  • PC => первичный ключ в item_category модели
  • 202202 => год & месяц
  • 001 => автоинкременты

Теперь, мой вопрос в том, как получить объект/значение ForeignKey поля на основе выбранных данных в переменную? Таким образом, это будет изменять PrimaryKey в поле generate_code каждый раз, когда добавляются новые данные.

Также, как правильно сделать автоинкремент? Потому что сейчас я просто использую кверисет .count()

Вот моя модель:

class item_category(models.Model):
    id_item = models.CharField(primary_key=True, max_length=5, unique=True)
    name_item = models.CharField(max_length=150)

    def __str__(self):
        return self.name_item 

def auto_increment():
    last_item_code = item_code.objects.all().last()

    total_item = item_code.objects.all().count() + 1
    join_dates = datetime.now().strftime('%Y%m.')

    if not last_kode_barang:
        return 'NB.' + str(join_dates) + '00' + str(total_item)

    else:
        item_cat_id = last_kode_barang.id_item_category + '.'
        
        new_item_id =  str(kat_barang_id + join_dates + '00' + str(total_item))

        if total_barang >= 10:
            new_barang_id =  str(kat_barang_id + join_dates + '0' + str(total_barang))
        
    return new_item_id

class item_code(models.Model):
    id_item_category = models.ForeignKey(kategori_barang, on_delete=models.CASCADE, db_column='id_barang')
    generate_code = models.CharField(primary_key=True, editable=False, default=auto_increment, max_length=20)

Хм. Я думаю, что самым простым способом будет использование @property. Мне трудно понять, что именно вы ищете, но вот общий пример

class MyModel(models.Model):
    created_at = models.DateTimeField(False, True, editable=False)
    product_id = models.AutoField(primary_key=True)

    @property
    def generated_code(self):
        return f"PC.{self.created_at}.{self.product_id}"

Несомненно, вам нужно еще поработать над форматированием и факторизацией, но это должно стать отправной точкой.

Вернуться на верх