Django Элемент, соответствующий запросу, не существует

У меня есть приложение, в котором, когда кто-то сохраняет предмет, он также сохраняется в item_transactionlog, но когда я пытаюсь запустить код, он выбрасывает error api.models.Item.DoesNotExist: Item matching query does not exist.

вот мой models.py

class Item(models.Model):
cl_itemid = models.CharField(primary_key=True, max_length=20)
studid = models.CharField(max_length=9, blank=True, null=True)
office = models.ForeignKey('ClearingOffice', models.DO_NOTHING, blank=True, null=True)
sem = models.CharField(max_length=1, blank=True, null=True)
sy = models.CharField(max_length=9, blank=True, null=True)
remarks = models.TextField(blank=True, null=True)
resolution = models.TextField(blank=True, null=True)
resolve = models.BooleanField(blank=True, null=True)
resolve_date = models.DateField(blank=True, null=True)
resolve_by = models.CharField(max_length=8, blank=True, null=True)
recorded_by = models.CharField(max_length=8, blank=True, null=True)
record_date = models.DateField(blank=True, null=True)

class Meta:
    managed = False
    db_table = 'item'

def save(self, *args, **kwargs):
    ItemTransactionLog.objects.create(
        cl_itemid=Item.objects.get(cl_itemid=self.cl_itemid),
        trans_desc='Add Clearance Item',
        trans_recorded=timezone.now()
    )
    super(Item, self).save(*args, **kwargs)

что-то не так в cl_itemid=Item.objects.get(cl_itemid=self.cl_itemid) я просто не знаю, как это исправить. надеюсь, кто-нибудь сможет помочь

Вы должны определить создание объекта ItemTransactionLog в сигнале post_save. Иностранный объект не сохраняется при вызове метода create.

Предложенное решение:

Создайте сигнал post_save

Определите функцию:

def create_transaction_log(sender, instance, **kwargs):
        ItemTransactionLog.objects.create(
        cl_itemid=instance,
        trans_desc='Add Clearance Item',
        trans_recorded=timezone.now()
    )

Затем подключите эту функцию:

post_save.connect(create_transaction_log,sender=Item)

Вы пытаетесь получить элемент, который вот-вот будет создан, на самом деле в функции сохранения создается новый объект Item с новым cl_itemid, который не был создан!

Так что у вас не может быть запроса cl_itemid=Item.objects.get(cl_itemid=self.cl_itemid)

Одним из решений для этого является использование сигналов

Проблема в том, что вы пытаетесь получить запись, которая не была сохранена, вы можете сначала сохранить объект, а после этого создать журнал:

def save(self, *args, **kwargs):
    super(Item, self).save(*args, **kwargs)
    ItemTransactionLog.objects.create(
        cl_itemid=Item.objects.get(cl_itemid=self.cl_itemid),
        trans_desc='Add Clearance Item',
        trans_recorded=timezone.now()
    )

Кроме того, вместо выборки из БД можно просто использовать self.id:

ItemTransactionLog.objects.create(
    cl_itemid=self.id,
    ...
)
Вернуться на верх