【发布时间】:2019-09-20 02:09:48
【问题描述】:
我的应用中有这个模型,它旨在根据 save() 中添加的方法自动生成它的主键。
但是,对于每个对象,我都需要更新某些字段。现在,每当我在管理端(测试用例)进行更新时,它都会创建一条新的 PK 记录,而不是更新现有的记录。关于如何解决这个问题的任何想法?
class DeploymentTask(models.Model):
deployment_id = models.CharField(
'Deployment Task ID', primary_key=True, max_length=25, editable=False)
title = models.CharField(max_length=100)
current_status = FSMField('Current Status',
default=STATES[0], choices=STATES)
site_id = models.ForeignKey(
Site, related_name='+', on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
refuel_record = models.ManyToManyField(RefuelRecord)
def __str__(self):
"""String for representing the Model object."""
return self.deployment_id
class Meta:
db_table = 'rm_deployment_task'
verbose_name_plural = 'Deployment Tasks'
def get_absolute_url(self):
return reverse('deployment_id-view', args=[str(self.deployment_id)])
def save(self):
today = datetime.datetime.now()
ticket_count = DeploymentTask.objects.filter(
created_at__year=today.year, created_at__month=today.month).count() + 1
new_task_id = 'DPT-' + str(str(datetime.date.today().year)) + str(
datetime.date.today().month).zfill(2) + str(
datetime.date.today().day).zfill(2) + '-' + str(ticket_count).zfill(6)
self.deployment_id = new_task_id
super(DeploymentTask, self).save()
【问题讨论】:
-
将用于创建
deployment_id的代码包装在if not self.pk中。这样,如果 pk 已经分配,它不会重新计算它。 -
注意:将
update_fields添加到您的super()调用中是一个非常糟糕的主意,因为这意味着您永远无法保存任何其他字段。 -
感谢您的意见。我设法通过不自定义 save() 方法并从我的模型中定义一个函数来修复它,该函数将生成该 id 并将此方法分配为我的 pk 的默认方法。
标签: django django-models django-admin