Django: используйте update_or_create, имея значение внешнего ключа, но не экземпляр объекта внешнего ключа

У меня есть данные из необработанного sql запроса, в котором есть записи, которые выглядят следующим образом:

"product_id": 12345 "дата": 2022-12-25 "qty": 10

это должно попасть в таблицу с моделью "ProductMovement". Ее уникальным ключом является product_id и дата. product_movement имеет product_id в качестве внешнего ключа к модели Product.

ProductMovement.objects.update_or_create() требует, чтобы я предоставил экземпляр модели Product, а не только уникальный ключ. Это неудобно

Наверное, я могу использовать raw sql (бэкенд - postgresql), но мне интересно, есть ли другой способ. Могу ли я добавить что-то в менеджер моделей, что перехватывает значение ключа и заменяет его на экземпляр, так что, по крайней мере, я могу скрыть эту сложность от этой части кода? (Я никогда не работал с переопределениями менеджера моделей).

Попробуйте сначала это

Если ваша команда выглядит следующим образом ProductMovement.objects.update_or_create(product=productObj) has no _id
. Попробуйте выполнить ее так ProductMovement.objects.update_or_create(product_id=12345) с _id

Manager

Да! Вы можете переопределить функцию update_or_create - я сделал это для фильтров/гетов, чтобы легче получать M2M отношения

class ProductMovementManager(models.Manager):
    def update_or_create(self, *args, **kwargs):
        product = kwargs.pop('product')
        if type(product) == int:
            kwargs['product'] = Product.objects.filter(pk=product).first()
        else:
            # oops! It was already the object
            kwargs['product'] = product

        super().update_or_create(*args, **kwargs)

class ProductMovement(models.Model)
    product = models.ForeignKey(product, on_delete=models.PROTECT)

    objects = ProductMovementManager()

Вернуться на верх