【问题标题】:Cannot query "": Must be "User" instance in Django 3.2无法查询“”:必须是 Django 3.2 中的“用户”实例
【发布时间】:2021-11-20 15:31:57
【问题描述】:

我从下面的视图中得到这个错误:

from django.shortcuts import render, redirect
from movies import models as movies_models
from django.contrib.auth import get_user_model

User = get_user_model()


def playlists_view(request):
    if (not request.user.is_authenticated) or (not request.user.is_staff):
        return redirect('Login')

    playlists = movies_models.PlayList.objects.filter(created_by=request.user).order_by('-id')

    return render(request, 'cpanel/playlists.html', {'playlists': playlists})

我的播放列表模型是这样的:

from django.db import models
class PlayList(models.Model):
    type = models.PositiveSmallIntegerField(choices=type_choice, default=1, verbose_name='نوع فیلم')
    category = models.ManyToManyField(Category, related_name='Playlists', verbose_name='دسته بندی و ژانر')
    name_en = models.CharField(max_length=55, unique=True, verbose_name='نام انگلیسی')
    name_fa = models.CharField(max_length=55, unique=True, verbose_name='نام فارسی')
    summary = models.TextField(max_length=1024, verbose_name='خلاصه فیلم')
    imdb_score = models.FloatField(default=0, verbose_name='IMDB امتیاز')
    users_score = models.FloatField(default=0, verbose_name='امتیاز کاربران')
    # seen_number = models.FloatField(default=0, verbose_name='تعداد نفراتی که فیلم را مشاهده کرده اند')
    publish_status = models.CharField(max_length=55, null=True, blank=True)
    is_free = models.BooleanField(default=False, verbose_name='رایگان است')
    visit_times = models.IntegerField(default=0)
    play_times = models.IntegerField(default=0)
    year = models.CharField(max_length=4, verbose_name='سال')
    time = models.CharField(max_length=55, verbose_name='مدت زمان فیلم')
    tv_pg = models.PositiveSmallIntegerField(choices=tv_pg_choice, default=5, verbose_name='درجه بندی سنی')
    actor = models.ManyToManyField(Actor, blank=True, verbose_name='بازیگران')
    director = models.ManyToManyField(Director, blank=True, verbose_name='کارگردان')
    thumb_image = models.ImageField(null=True, blank=True, editable=True, upload_to=image_path,
                                    verbose_name='تصویر انگشتی فیلم')
    image_1920x1080 = models.ImageField(null=True, blank=True, editable=True, upload_to=image_path,
                                        verbose_name='تصویر بنر دسکتاپ فیلم')
    image_600x810 = models.ImageField(null=True, blank=True, editable=True, upload_to=image_path,
                                      verbose_name='تصویر بنر موبایل فیلم')
    country = models.ManyToManyField(Country, verbose_name='کشور')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(null=True, blank=True)
    created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    users_score_n = models.IntegerField(default=0)
    users_score_p = models.IntegerField(default=0)
    trailer_url = models.CharField(max_length=512, null=True, blank=True, verbose_name='آدرس تریلر')
    page_url = models.CharField(max_length=255, null=True, blank=True, help_text='This field is Read Only')

    def __str__(self):
        return self.name_en + ' | Type: ' + str(self.type) + ' | ID: ' + str(self.id)

    def get_absolute_url(self):
        return reverse("playlist", kwargs={"pk": self.id, "name_en": self.name_en, "name_fa": self.name_fa})

    def save(self, *args, **kwargs):
        old_image_name = self.thumb_image.name
        super().save(*args, **kwargs)

        if self.type == 1:
            self.page_url = 'movie/' + str(self.id) + '/' + name_to_url(self.name_en) + '/' \
                            + name_to_url(self.name_fa) + '/'
        else:
            self.page_url = 'series/' + str(self.id) + '/' + name_to_url(self.name_en) + '/' \
                            + name_to_url(self.name_fa) + '/'
        super().save(*args, **kwargs)
        if old_image_name != self.thumb_image.name:
            image_resize(self.thumb_image.name)

但是这个模型的重要部分是这个字段:

created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)

我这样定义用户:

from django.contrib.auth import get_user_model

User = get_user_model()

当我在本地主机中运行 django 应用程序时没问题,但在生产服务器中我收到此错误:(

我尝试不使用request.user,而是使用User.objects.get(username=request.user),但我在下面的行中遇到了同样的错误:

playlists = movies_models.PlayList.objects.filter(created_by=request.user).order_by('-id')

My User 是一个简单的用户模型,继承自 AbstractUser 模型。

感谢您的关注。 :)

【问题讨论】:

  • 您好!你能告诉我们完整的错误信息吗?另外,由于您说它在 dev 本地工作但在 prod 中不起作用,这可能是设置的差异。你碰巧在 dev 和 prod 中有不同的配置文件吗?如果可以,你可以给他们看吗?

标签: python python-3.x django django-models django-views


【解决方案1】:

您似乎正在使用自定义 User 类。确保它是您的模型中使用的那个。如Referencing the User model 中所述:

如果您直接引用User(例如,通过在外键中引用它),您的代码将无法在 AUTH_USER_MODEL 的项目中运行设置已更改为不同的用户模型。

当您为用户模型定义外键或多对多关系时,您应该使用 AUTH_USER_MODEL 设置指定自定义模型

首先,确保您在 settings.py 中正确地substituted the custom user class 并执行了必要的migration

...
AUTH_USER_MODEL = 'myapp.MyUser'
...

然后,尝试更改此设置(假设此处的 User 还不是 get_user_model() 的结果,因为问题中的粘贴模型中没有指出):

created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)

收件人:

from django.conf import settings
...
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True)

或者:

from django.contrib.auth import get_user_model
...
created_by = models.ForeignKey(get_user_model(), on_delete=models.SET_NULL, null=True, blank=True)

确保他们是migrated correctly without failures:

python manage.py makemigrations
python manage.py migrate

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2021-02-15
    • 2017-12-27
    • 1970-01-01
    • 2022-07-26
    • 2021-04-08
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多