Django根据所选字段生成自定义ID

2024-10-01 13:28:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在新记录进入数据库时根据所选表单字段生成一个自定义事务ID。格式应该是

2020/John UK/1012/001, 2020/John Uk/1012/002

其中2020年为季节,John为供应商名称,UK为地点,1012为日期,001为当天计数

计数应始终从001开始,并根据供应商、地点和日期增加。例如,如果同一供应商第二天从同一地点带来货物,则ID应为

2020/John UK/1112/001

如果来自不同的地点和相同的日期,则ID将

2020/John US/1112/001

models.py

class Goods_Supply(BaseModel):
    transaction_id = models.CharField(max_length=50, default="_", blank=True)
    supplier_name = models.ForeignKey(adminModels.Supplier, on_delete=models.CASCADE, null=True, blank=True)
    season = models.ForeignKey( adminModels.Season, on_delete=models.CASCADE, blank=True, null=True)
    location = models.ForeignKey( adminModels.Location, on_delete=models.CASCADE, blank=True, null=True)
    transaction_date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)
     quantity = models.IntegerField(blank=True, default=0, null=True)

    def __str__(self):
        return self. transaction_id

类位置(基本模型):

location_name = models.CharField(max_length=50)
country = models.ForeignKey(Country, on_delete=models.CASCADE)

def __str__(self):
    return self.location

类别供应商(基本型号):

supplier_name = models.CharField(max_length=50)
license = models.CharField(max_length=50, default="_")
prefix = models.CharField(max_length=50, default="_")
rep = models.CharField(max_length=50, default="_")
phone = models.CharField(max_length=50, default="_")
email = models.CharField(max_length=50, default="_")
status = models.IntegerField(default=0)
visible = models.BooleanField(default=False)

def __str__(self):
    return self.supplier_name






forms.py

class GoodSupplyForms(ModelForm):
    class Meta:
        model = Models.Goods_Supply
        fields = ["transaction_id", "supplier_name", "season", " location", "transaction_date”, “quantity”]


goods_supply.py

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.template import loader
from django.core.paginator import Paginator
import CMCADMIN.models as adminModels
from SS.models import Goods_Supply
from SS.forms import GoodSupplyForms
from django.urls import reverse


def get_post_handler(request):
    if request.method == 'GET':
        return get(request)
    else:
        return post(request)


def get(request):
    template = loader.get_template("SS/goods_supply.html")
    goodssupply = Goods_Supply.objects.all()
    paginator = Paginator(ss_registrations, 10)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    context = {'goodssupply': page_obj, 'adminModels': adminModels}
    return HttpResponse(template.render(context, request))


def post(request):
    if request.method == 'POST':
        goodsForm = GoodSupplyForms(request.POST)
        if goodsForm.is_valid():
            goodsForm.save()

            print('Success')
            return HttpResponseRedirect(reverse("SS:goods_supply”))

        else:
            return HttpResponse(goodsForm..errors.as_json())

    return HttpResponseRedirect(reverse("SS:goods_supply”))

Tags: fromimportselftruedefaultgetreturnmodels
1条回答
网友
1楼 · 发布于 2024-10-01 13:28:41

您必须重写save方法

def save(self, *args, **kwargs):
        if not self.pk:
            year, month, date = self.transaction_date.year, self.transaction_date.month, self.transaction_date.day 
            count = Goods_Supply.objects.filter(supplier_name=self.supplier_name, transaction_date=self.transaction_date,location__location_name=self.location.location_name).count() + 1
            total_count = "{0:04d}".format(count)
            self.transaction_id = "{}/{}-{}/{}{}/{}".format(year, self.supplier_name.supplier_name, self.location.location_name, month, date, total_count)

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

相关问题 更多 >