Django get_or_create | update_or_create
Я пытаюсь реализовать get_or_create | update_or_create, но получаю следующее сообщение об ошибке:
TypeError: Поле 'id' ожидало число, но получило <SimpleLazyObject: <User: admin>>.
БОЛЕЕ ПОДРОБНАЯ ИНФОРМАЦИЯ: Файл "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/models/query.py", строка 657, in get_or_create return self.get(**kwargs), False Файл "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/models/query.py", строка 496, in get raise self.model.DoesNotExist( wallet.models.SelectedWallet.DoesNotExist: SelectedWallet, соответствующий запросу, не существует.
Во время обработки вышеуказанного исключения произошло другое исключение:
Traceback (последний последний вызов): File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/models/fields/init.py", line 1988, in get_prep_value return int(value) TypeError: аргумент int() должен быть строкой, байтоподобным объектом или числом, а не 'SimpleLazyObject'
Вышеуказанное исключение стало непосредственной причиной следующего исключения: Traceback (последний последний вызов): File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/core/handlers/exception.py", line 55, in inner response = get_response(request) Файл "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/core/handlers/base.py", строка 197, в _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) Файл "/Volumes/HDD/Allan/django/venv/project_onefinance/onefinance/views.py", строка 43, in select_wallet obj, created = SelectedWallet.objects.update_or_create( Файл "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/django/db/models/manager.py", строка 85, в manager_method return getattr(self.get_queryset(), name)(*args, **kwargs)
class SelectedWallet(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
wallet = models.name = models.ForeignKey(Wallet, default=1, on_delete=models.CASCADE)
created = models.DateField(verbose_name='Created', auto_now_add=True)
modified = models.DateField(verbose_name='Modified', auto_now=True)
created_by = models.ForeignKey('auth.User', related_name='selected_wallet_created_by', blank=True, null=True, default=None, on_delete=models.SET_DEFAULT)
modified_by = models.ForeignKey('auth.User', related_name='selected_wallet_modified_by', blank=True, null=True, default=None, on_delete=models.SET_DEFAULT)
class Meta:
db_table = 'myapp_selected_wallet'
ordering = ['wallet__name']
verbose_name = 'Selected_Wallet'
verbose_name_plural = 'Selected_Wallets'
def __str__(self):
"""String for representing the Model object."""
return self.wallet.name
def save(self, *args, **kwargs):
super(SelectedWallet, self).save(*args, **kwargs)
def select_wallet(request):
if request.method == "POST":
wallet = request.POST['wallet_id']
user = get_current_user()
created_time = datetime.datetime.now().strftime ("%Y-%m-%d")
# First method attempt
defaults = {
'created': created_time,
'created_by_id': user,
'modified_by_id': user,
'user_id': user,
'wallet_id': wallet
}
try:
obj = SelectedWallet.objects.get(user_id=user)
for key, value in defaults.items():
setattr(obj, key, value)
obj.save()
except SelectedWallet.DoesNotExist:
obj = SelectedWallet(
created = created_time,
created_by_id = user,
modified_by_id = user,
user_id = user,
wallet_id = wallet
)
obj.save()
# Second method attempt (both receive the same error)
obj, created = SelectedWallet.objects.update_or_create(
id = 2,
created = created_time,
created_by_id = user,
modified_by_id = user,
user_id = user,
wallet_id = wallet
)
selected_wallet = (SelectedWallet.objects
.filter(user_id=user)
.filter(wallet_id=wallet)
)
return JsonResponse(list(selected_wallet.values('wallet_id')), safe = False)