Django models 将三个模型转换为单个查询django查询

Django models 将三个模型转换为单个查询django查询,django-models,Django Models,这是我的模型,其中包含一些字段: class Advertisers(models.Model): account_manager_id = models.ForeignKey(AccountManagers, on_delete=models.CASCADE,null=True, db_column='account_manager_id',related_name="advertisers") class AdvertiserUsers(models.Model

这是我的模型,其中包含一些字段:

class Advertisers(models.Model):
    account_manager_id = models.ForeignKey(AccountManagers, on_delete=models.CASCADE,null=True, db_column='account_manager_id',related_name="advertisers")

class AdvertiserUsers(models.Model):
    user_id = models.OneToOneField('Users', on_delete=models.CASCADE,null=True,db_column='user_id', related_name='advertiser_users')
    advertiser_id = models.ForeignKey('Advertisers', on_delete=models.CASCADE,null=True,db_column='advertiser_id', related_name='advertiser_users')


class Users(models.Model):
    email = models.CharField(unique=True, max_length=100)

我想要所有广告商的Id、用户Id和电子邮件

所有用户的Id:-

advertiser_ids = advertisers.objects.all() # can get id from here
查找广告商ID的用户ID:

user_ids = AdvertiserUsers.objects.filter(advertiser_id__in=advertiser_ids) # can get user_id from here
使用此查询查找id和电子邮件:

user_ids = Users.objects.filter(id__in=user_ids) # can get email from here

如何使它更短像直接从广告商查询我将能够得到用户的电子邮件

提前感谢

您可以使用以下内容进行筛选:

Users.objects.filter(advertiser_users__advertiser_id__isnull=False).distinct()
由此产生的
用户
对象具有
电子邮件
属性(以及属于
用户
对象的其他属性),以及
.account\u manager\u id
广告商id
。尽管如此,这可能不是一个好主意:您现在建模的方式是,一个
用户
对象可以与多个
广告商
对象关联,因此将这些对象添加在一起没有多大意义

您可以为每个用户访问相关的
广告客户
s,方法是:

myusers = Users.objects.filter(
    advertiser_users__advertiser_id__isnull=False
).prefetch_related(
    'advertiser_users',
    'advertiser_users__advertiser_id'
).distinct()
for user in myusers:
    print(f'{user.email}')
    for advuser in user.advertiser_users.all():
        print(f'    {advuser.advertiser_user.pk}')
myusers=Users.objects.filter(
广告商\用户\广告商\ id \广告商isnull=False
).prefetch_相关(
“广告商用户”,
'广告客户\用户\广告客户\ id'
).distinct()
对于myusers中的用户:
打印(f'{user.email}')
对于user.advertiser\u users.all()中的advuser:
打印(f'{advuser.advertiser\u user.pk}')

注意:通常Django型号的名称是单数,因此
用户
而不是
用户


注意:通常不会在
外键
字段中添加后缀
\u id
,因为Django 将自动添加带有
\u id
后缀的“twin”字段。因此,它应该 成为
客户经理\u id
,而不是
客户经理

您可以使用以下选项进行筛选:

Users.objects.filter(advertiser_users__advertiser_id__isnull=False).distinct()
由此产生的
用户
对象具有
电子邮件
属性(以及属于
用户
对象的其他属性),以及
.account\u manager\u id
广告商id
。尽管如此,这可能不是一个好主意:您现在建模的方式是,一个
用户
对象可以与多个
广告商
对象关联,因此将这些对象添加在一起没有多大意义

您可以为每个用户访问相关的
广告客户
s,方法是:

myusers = Users.objects.filter(
    advertiser_users__advertiser_id__isnull=False
).prefetch_related(
    'advertiser_users',
    'advertiser_users__advertiser_id'
).distinct()
for user in myusers:
    print(f'{user.email}')
    for advuser in user.advertiser_users.all():
        print(f'    {advuser.advertiser_user.pk}')
myusers=Users.objects.filter(
广告商\用户\广告商\ id \广告商isnull=False
).prefetch_相关(
“广告商用户”,
'广告客户\用户\广告客户\ id'
).distinct()
对于myusers中的用户:
打印(f'{user.email}')
对于user.advertiser\u users.all()中的advuser:
打印(f'{advuser.advertiser\u user.pk}')

注意:通常Django型号的名称是单数,因此
用户
而不是
用户


注意:通常不会在
外键
字段中添加后缀
\u id
,因为Django 将自动添加带有
\u id
后缀的“twin”字段。因此,它应该 成为
客户经理\u id
,而不是
客户经理


我想要id、用户id和电子邮件。我想要id、用户id和电子邮件。请在回答中添加说明。请不要使用
.values()
。这是一个问题。请在回答中添加解释。请不要使用
.values()
。这是一个很好的例子。