【问题标题】:Try to join a OneToOne relationship in Django尝试在 Django 中加入 OneToOne 关系
【发布时间】:2017-07-14 11:31:58
【问题描述】:

我需要一些帮助来使用 Django 进行连接,这看起来应该很容易。我查看了文档,但似乎由于某种原因它不会加入。

我试图进入我的视图,model.Photo 和 model.PhotoExtended 都加入并显示在视图中。目前,我只是试图让 model.Photo 显示,但加入一个可以找到 request.user 并根据它过滤它的连接。

它们在不同的应用程序中。

models.py 用于 model.Photo

class Photo(ImageModel):
    title = models.CharField(_('title'),
                         max_length=60,
                         unique=True)
    slug = models.SlugField(_('slug'),
                        unique=True,
                        help_text=_('A "slug" is a unique URL-friendly title for an object.'))

models.py for model.PhotoExtended

class PhotoExtended(models.Model):

    Photo = models.OneToOneField(Photo, related_name='extended', help_text='Photo required', null=True)

    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, help_text='User that uploaded the photo')

views.py

class PhotoExtendedUserView(ListView):
    template_name = 'photo_user_list.html'

    def get_queryset(self):
        user = get_object_or_404(User, username=self.request.user)

        return Photo.objects.filter(photoextended__user=user)

【问题讨论】:

  • 什么不起作用?

标签: django django-queryset django-orm


【解决方案1】:

您将Photo 上的related_name (顺便说一下,不应大写)设置为extended,因此您需要像这样进行过滤:

class PhotoExtendedUserView(ListView):
    template_name = 'photo_user_list.html'

    def get_queryset(self):
        user = get_object_or_404(User, username=self.request.user)
        # 'extended' vs. 'photoextended'
        return Photo.objects.filter(extended__user=user)

【讨论】:

  • 您好,谢谢,效果很好。那么为什么延长工作,而不是光延长呢?是不是因为你必须使用模型上的最后一个词?
  • related_name 参数会覆盖您使用的术语,因此如果您使用了models.OneToOneField(Photo, related_name='superawesome'),那么您将使用filter(superawesome__user=user) 进行过滤。如果您不使用related_name,则默认值是类的名称,在您的情况下为photoextended
  • 我明白了,我忘记在模型中设置了。非常感谢!
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 2015-03-10
  • 2019-09-21
  • 2014-11-14
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 2011-01-16
相关资源
最近更新 更多