首页 文章

理解Django中的查询集有困难

提问于
浏览
1

我有一个用户配置文件页面连接到一个模型,其中包含以下内容:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')

这应该是应该的;加载连接到相关用户的配置文件图像,并进行用户之间的区分 . 我现在要做的是将一个单独的图库模型连接到 Profiles 页面,用户可能会有一个小图像库 . 画廊模型如下所示:

class GalleryModel(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    img_1 = models.ImageField(default='default.jpg', upload_to='images')
    img_2 = models.ImageField(default='default.jpg', upload_to='images')
    img_3 = models.ImageField(default='default.jpg', upload_to='images')

views.py文件如下所示:

class ProfileDetailView(DetailView):
    model = Profile   # Is something iffy here? Should this refer to the GalleryModel as well?
    template_name = 'account/view_profile.html'

    def get_object(self):
        username = self.kwargs.get('username')
        if username is None:
            raise Http404
        return get_object_or_404(User, username__iexact=username, is_active=True)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        username = self.object.username
        context['person'] = GalleryModel.objects.get(user__username=username)   #loads username string
        context['img_1'] = GalleryModel.objects.last().img_1
        context['img_2'] = GalleryModel.objects.last().img_2
        context['img_3'] = GalleryModel.objects.last().img_3
        return context

我已经尝试了一堆想法(即过滤器()和get()方法的各种方法)并仔细检查https://docs.djangoproject.com/en/2.1/topics/db/queries/并筛选我在SO上可以找到的内容,但我无法解决它 .

例如,filter(username__iexact = username)似乎没有做到这一点,主题上的变体也没有产生任何错误消息,我真的不明白 . 如果我在模板中插入{},我可以获得用户名,但如何在GalleryModel中获取与用户名相关联的对象(图像)?

尝试以下是不行的:

GalleryModel.objects.get(user__username=username).img_1

一如既往,我有一种令人毛骨悚然的感觉,我错过了一些相当简单的东西:)

注意!:我知道last()方法不是我应该做的,显然,但到目前为止,这是我设法将图像渲染到模板的唯一方法 .

1 回答

  • 2

    如果要将Gallery连接到配置文件,则必须添加Profile作为ForeignKey,而不是User .

    class GalleryModel(models.Model):
        profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
    

    除非您有其他类型的图库,否则请使用图库(models.Model) .

相关问题