简体   繁体   中英

django ajax: User matching query does not exist

So I made a django ajax that everytime there is a new message the notification object that I add to my user models will be +1, the problem is that I dont know why is giving me this error:

django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.

here is my code:

views.py:

def count_notification(request): 
    user = request.user  
    obj = user.profile.objects.get(pk=1)
    obj.notifications = obj.notifications +1
    obj.save()
    response_data = {'success':1}
    return HttpResponse(json.dumps(response_data), content_type="application/json")

urls.py:

path('messages/notification/', count_notification)

html file js

// Add the notification val
$.get('notification/')

models.py:

class ProfileImage(models.Model):
    """
    Profile model
    """
    user = models.OneToOneField(
        verbose_name=_('User'),
        to=settings.AUTH_USER_MODEL,
        related_name='profile',
        on_delete=models.CASCADE
    )
    avatar = models.ImageField(upload_to='profile_image')
    notifications = models.FloatField(default='0')

thank you for the help

obj = user.profile.objects.get(pk=1)

i think your app is dealing with many users, each user has its own profile with its own notification count, so why you are fixing the id / pk to 1, you need to get the related profile, not hard code the id

try this code below

def count_notification(request):
    user = request.user

    user.profile.notifications += 1
    user.profile.save()

    response_data = {'success':1}

    return HttpResponse(json.dumps(response_data), content_type="application/json")

and change

notifications = models.FloatField(default='0')

to

notifications = models.IntegerField(default='0')

it does make more sens since notifications count is an integer not float nand don't forget to rerun migrations

Update

i guess you have not defined a custom User model in settings.py in this case you need to make some changes in models.py

refer to https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#reusable-apps-and-auth-user-model

from django.contrib.auth import get_user_model  # get the default User model

User = get_user_model()

class ProfileImage(models.Model):
    """
    Profile model
    """
    user = models.OneToOneField(
        verbose_name=_('User'),
        # to=settings.AUTH_USER_MODEL, # you don't need this since you didn't 
                                       # defined a custom User model in 
                                       # setting.py
        to = User,  # HERE
        related_name='profile',
        on_delete=models.CASCADE
    )
    avatar = models.ImageField(upload_to='profile_image')
    notifications = models.IntegerField(default='0')  # change the field type 

Update 2

from django.contrib.auth import get_user_model

User = get_user_model()

..

def count_notification(request):
    # user = request.user
    user = User.objects.filter(id=request.user.id).first()  # HERE

    user.profile.notifications += 1
    user.profile.save()

    response_data = {'success':1}

    return HttpResponse(json.dumps(response_data), content_type="application/json")

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM