无法在 Django 中自定义主键模式

Unable to customize the primary key pattern in Django

我有 3 个模型,StudentCourseFee。我想创建一个报告,它将把这 3 个模型包含的所有数据放在一起,并带有自己的 ID。

机型:

class Student(models.Model):
    roll_number=models.IntegerField(primary_key=True)
    name=models.CharField(max_length=50)
    email=models.EmailField(max_length=60)
    city=models.CharField(max_length=20)

class CourseChoices(models.Model):
    courses=models.CharField(max_length=30, blank=True)

    def __str__(self):
        return self.courses

class Course(models.Model):
    roll_number=models.ForeignKey(Student, on_delete=CASCADE)
    course=models.ForeignKey(CourseChoices, on_delete=CASCADE)

class Fee(models.Model):
    roll_number=models.ForeignKey(Student, on_delete=CASCADE)
    amount_to_be_paid=models.DecimalField(max_digits=7, decimal_places=2, default=0)
    discount=models.DecimalField(max_digits=5, decimal_places=2, default=0)
    Final_amount_to_be_paid=models.DecimalField(max_digits=5, decimal_places=2, default=0)
    Amount_received=models.DecimalField(max_digits=5, decimal_places=2, default=0)
    Balance=models.DecimalField(max_digits=5, decimal_places=2, default=0)
    batch=models.IntegerField()

现在,学生可以分期支付 his/her 费用,这样会在跟踪报告中创建多个实例。我希望用户使用主 key/id 跟踪每笔交易。下面是一个例子:

我有其他模型可以将所有内容组合在一起:

class Report(models.Model):
    id = models.IntegerField(primary_key=True)
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    course = models.ForeignKey(Course, on_delete=models.CASCADE)
    fee = models.ForeignKey(Fee, on_delete=models.CASCADE)

    def _get_next_id(self):
        last = Report.objects.all().aggregate(models.Max('id'))['id__max']
        if last:
            last += 1
            self.id = "{}{:04d}".format('HB', last)
        elif not last:
            last = 1
        self.id = "{}{:04d}".format('HB', last)

    def save(self, *args, **kwargs):
        if not self.id:
            self.id = self._get_next_id()
        super().save(*args, **kwargs)

费用的观点:

def fee_view(request):
    if request.method=='POST':
        fm_fee=FeeForm(request.POST)
        if fm_fee.is_valid():
            fee=fm_fee.save()
            Report.objects.create(student=fee.roll_number, fee=fee, course=Course.objects.get(roll_number=fee.roll_number))
            fm_fee=FeeForm()
        return render(request, 'account/fee.html', {'form1':fm_fee})
    else:
        fm_fee=FeeForm()
        return render(request, 'account/fee.html', {'form1':fm_fee})

但是,当我检查数据库时,id 没有得到我打算给它的模式。我认为 Report 模型中的 _get_next_idsave 方法存在问题,但我不知道。这里有人会知道吗?请帮忙。

您已将 id 定义为整数字段,因此数据库不会在此处存储字符串。

如果您删除 Report class 的自定义 id 字段并让 Django 自动生成主键,事情会变得简单。然后您不再需要 _get_next_id 方法和覆盖的 save 方法。相反,您可以添加 track_id 属性 以您自己的自定义格式为报告生成一个 ID。

Report class 看起来像:

class Report(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    course = models.ForeignKey(Course, on_delete=models.CASCADE)
    fee = models.ForeignKey(Fee, on_delete=models.CASCADE)

    @property
    def track_id(self):
        if self.pk:
            return "{}{:04d}".format('HB', self.pk)
        else:
            return ""

在您的模板中,您可以这样做:

{% for transaction in reports %}
    ...
    {{ transaction.track_id }}
    ...
{% endfor %}