【问题标题】:Django INNER JOIN and WHEREDjango INNER JOIN 和 WHERE
【发布时间】:2021-06-18 11:54:39
【问题描述】:

让我向您介绍一下结构。假设我有 3 个模型定义为:

class User(AbastractUser):
    some fields...

class UserProfile(Model):
    gender = models.CharField(max_length=10, choices=GENDER_CHOICES, default='unknown', verbose_name=_('Gender'))
...
    user = models.OneToOneField(User, related_name='userprofile', on_delete=CASCADE)
    preferences = models.OneToOneField(
        Preferences, related_name='user_profile', null=True, on_delete=CASCADE
    )

class Preferences(TimestampedModel):
    some fields...
    method = models.CharField(
        max_length=10, null=True, blank=True, default=None, choices=[(x, x) for x in methods]
    )

我想用 django 模型编写这个查询,应该怎么做?

查询:


SELECT * from users as u
INNER JOIN users_profile as up ON u.id as up.user_id
INNER JOIN preferences as p ON p.id as up.preference_id
WHERE p.method = 'TEST' 

任何建议,最干净、最优化的方法是什么?

【问题讨论】:

    标签: python django django-models orm


    【解决方案1】:

    您可以使用以下方式过滤:

    User.objects.filter(<b>userprofile__preferences__method='TEST'</b>)

    【讨论】:

    • 您好,谢谢!但是我的另一个问题是,如果我还想从该首选项表中选择一些东西,那也会在过滤数据中,还是仅来自用户表中的数据。 (希望你理解这个问题)
    • @vukojevicf:你可以使用.select_related,所以User.objects.filter(...).select_related('user_profile')。
    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2011-09-09
    • 1970-01-01
    • 2016-04-28
    相关资源
    最近更新 更多