如何连接多个模型并以pythonic的方式获得结果?

如何连接多个模型并以pythonic的方式获得结果?,python,django,django-models,orm,sqlite,Python,Django,Django Models,Orm,Sqlite,我有四种型号 class User(models.Model): id = models.IntegerField(primary_key=True) name = models.CharField() class Subscription(models.Model): user_id = models.ForeignKey(User) title = models.CharField() class Address(models.Model): user_id = mo

我有四种型号

class User(models.Model):
  id = models.IntegerField(primary_key=True)
  name = models.CharField()

class Subscription(models.Model):
  user_id = models.ForeignKey(User)
  title = models.CharField()

class Address(models.Model):
  user_id = models.ForeignKey(User)
  street  = models.CharField()

class Wallet(models.Model):
  user_id = models.ForeignKey(User)
  balance = models.DecimalField(max_digits=6, decimal_places=2)
在这里,我想获得订阅行以及受尊敬的用户地址和钱包余额。这是否可以在单个查询(ORM)中检索

我听说了select_related()和prefetch_related()。但不知道如何在一个查询集中把所有内容放在一起


如何以pythonic方式实现这一点?

首先从FK字段中删除
\u id
。您仍然有
subscription.user\u id
(int)和
subscription.user
,即
user
。现在您必须编写
subscription.user\u id\u id
以访问id

您是否了解用户可以在db设计中拥有多个钱包和地址

使用ORM在单个查询中不可能做到这一点。但是可以在3个查询中完成(不管有多少条记录)

更新:

class User(models.Model):
      name = models.CharField()

class Subscription(models.Model):
      user = models.ForeignKey(User, related_name='subscriptions')
      title = models.CharField()

class Address(models.Model):
      user = models.ForeignKey(User, related_name='addresses')
      street  = models.CharField()

class Wallet(models.Model):
      user = models.ForeignKey(User, related_name='wallets')
      balance = models.DecimalField(max_digits=6, decimal_places=2)


subscriptions = Subscription.objects.select_related('user').prefetch_related(
                    'user__wallets', 'user__addresses')

for s in subscriptions:
    print(s.user.name)
    for wallet in s.user.wallets.all():
        print(wallet.balance)
    for address in s.user.addresses.all():
        print(address.street)
您是否尝试过按照文档进行操作

拥有一个
用户
对象实例,您可以执行以下操作来访问订阅:

user.subscription_set.all()

不过,需要分别致电不同的经理来收集您的所有数据。

类似的情况
User.objects.filter(id=?)。选择与订阅相关的(“订阅”、“地址”、“钱包”)
User表中没有订阅、地址和钱包的引用。以上字段是表中唯一可用的字段:(你能用完整的models.py更新你的问题吗?现在没有时间进行测试,但是这可以通过序列化程序,
serializers.serialize('python',User.objects.get(id=?),fields=('id','name','subscription\u set\u User\u id','subscription\u set\u title',…))
Post your models.py它将更加helpfull@Mojimi听起来他并不是真的在表之间设置了外键。如果用户应该只有一个钱包和地址,那么使用
选择相关的
,将FKs移动到用户模型并通过一次查询检索所有内容。在用户对象上找不到“wallet\u set”,则“user\u wallet\u set”为预取\u related()的参数无效。用户模型中没有对Wallet的引用。我只有Wallet模型中对用户模型的引用。感谢您通知一个用户的“\u id”和多个Wallet。但我的核心问题仍然存在:(
\u set
是外键的默认
相关名称
。但我更喜欢像现在这样隐式指定它。检查它。可能是因为您没有更新模型,所以它不起作用。对于您的模型,它应该是
。预取相关('user\u id\u wallet\u set','user\u id\u address\u set')