无法在 Django 中自定义主键模式
Unable to customize the primary key pattern in Django
我有 3 个模型,Student
、Course
和 Fee
。我想创建一个报告,它将把这 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_id
和 save
方法存在问题,但我不知道。这里有人会知道吗?请帮忙。
您已将 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 %}
我有 3 个模型,Student
、Course
和 Fee
。我想创建一个报告,它将把这 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_id
和 save
方法存在问题,但我不知道。这里有人会知道吗?请帮忙。
您已将 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 %}