【问题标题】:Get site-specific user profile fields from user-created object从用户创建的对象中获取特定于站点的用户配置文件字段
【发布时间】:2018-09-09 02:03:06
【问题描述】:

我正在使用 Django sites framework (Django 2.1) 将应用拆分为多个站点。除了User 模型之外,我的所有模型都是特定于站点的。这是我的Post 模型:

post.py

class Post(models.Model):
    parent = models.ForeignKey(
        'self',
        on_delete=models.CASCADE,
        related_name='children',
        related_query_name='child',
        blank=True,
        null=True,
    )
    title = models.CharField(
        max_length=255,
        blank=True,
    )
    body_raw = models.TextField()
    body_html = models.TextField(blank=True)
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )
    site = models.ForeignKey(Site, on_delete=models.CASCADE)
    on_site = CurrentSiteManager()

我没有问题按站点分隔帖子。当我想获得帖子时,我会致电:

posts = Post.on_site.filter(...)

我有一个名为UserProfile 的单独模型。这是一个多对一的配置文件,其中为每个用户站点组合创建了一个唯一的配置文件(类似于 SE 的配置文件实施)。个人资料有一个reputation 属性,我想在收到任何帖子时访问该属性。每个站点的 reputation 属性应该不同(例如,在 SE 上,您所属的每个站点都有不同的代表)。

user_profile.py

class UserProfile(models.Model):
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    reputation = models.PositiveIntegerField(default=1)
    site = models.ForeignKey(Site, on_delete=models.CASCADE)
    on_site = CurrentSiteManager()

当我从查询中获得Posts 时,如何访问用户的username(在User 模型上)以及用户的reputation(在UserProfile 模型上)?

我想做这样的事情:

Post.on_site.filter(...)
    .select_related('user__userprofile')
    .filter_related(user__userprofile.site == get_current_site())

如何过滤多对一相关模型?

【问题讨论】:

    标签: python django django-templates django-sites


    【解决方案1】:

    最好将UserProfile -> User关系设为OnetoOne
    因为 Django 不知道要显示多少配置文件中的哪一个

    (但你还需要定义related_name

    models.OneToOneField(get_user_model(), related_name='userprofile_rev')
    

    那么你就可以这样做了

    qs = Post.on_site.filer().select_related('user', 'user__userprofile_rev')
    for post in qs:
        print(post.user.username, post.user.userprofile_rev.reputation)
    

    如果您不想更改数据库结构,可以这样做
    (但您需要指定要返回的配置文件)

    qs = Post.on_site.filer().select_related('user').prefetch_related('user__userprofile_set')
    for post in qs:
        print(post.user.username, post.user.userprofile_set[0].reputation)
    

    【讨论】:

    • 但是我希望每个站点上的声誉值不同...是否有更好的方法可以使用您的方法来做到这一点,同时仍然保持每个站点的代表分开?
    • @Jacob ,那么您需要以某种方式过滤该相关集post.user.userprofile_set.filter(...).reputation
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2012-02-16
    • 2011-03-24
    • 2021-04-06
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多