如何连接多个模型并以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')
。