Django save () всегда создает новый объект - PullRequest
0 голосов
/ 01 мая 2019

В моем приложении есть эта модель, которая предназначена для автоматической генерации ее первичного ключа на основе метода, добавленного в 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()

введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 01 мая 2019
  • Вы всегда устанавливаете self.deployment_id на новое значение в методе сохранения.
  • Django пытается сделать UPDATE ... WHERE deployment_id = %, но пока нет записей с этим идентификатором (по крайней мере, если высохраняете «старый» объект в другую дату или с другим билетом_четной записи)
  • Если вы хотите обновить поля, отличные от deployment_id, то просто не устанавливайте self.deployment_id, если оно уже установлено.Если вы хотите обновить deployment_id, то не существует простого способа сделать это, потому что он используется в качестве первичного ключа (но вы можете запомнить старый pk и удалить этот объект после того, как создали новый во время save)

Подробнее в Django документах .

0 голосов
/ 01 мая 2019

Это мой обновленный код, который работал для меня ...

def make_id():
    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)  
    return new_task_id
class DeploymentTask(models.Model):
    deployment_id = models.CharField(
        'Deployment Task ID', primary_key=True, max_length=25, editable=False, default=make_id)
    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)])
...