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()