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)

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