Django 中的多对多关系
Many-to-Many relationship in Django
我有以下3个型号:
class Platform(models.Model):
title = models.CharField(max_length=100, unique=True)
class Profile(models.Model):
title = models.CharField(max_length=110, unique=True)
platform = models.ManyToManyField(Platform)
class Register(models.Model):
...
profile = models.ManyToManyField(Profile)
...
我的views.py
def info(request):
...
registers=Register.objects.all()
...
for register in registers:
profile= register.profile....???
我需要通过 Register 模型的查询了解一个或多个配置文件
可以吗?
您可以获得所有与一个或多个registers
相关的Profile
s:
Profile.objects.filter(<b>register__in=registers</b>)
或者您可以获得 Register
对象的 Profile
:
def info(request):
# …
registers=Register.objects.all()
# …
for register in registers:
profiles = register<b>.profile.all()</b>
但在这里您将访问数据库 per register
,这可能无法很好地扩展。
您可以像 , use .prefetch_related(…)
[Django-doc] 一样,通过一个额外的查询在内存中获取所有这些相关的 Profile
,然后在 Django/Python 级别执行 JOIN:
def info(request):
# …
registers=Register.objects.<b>prefetch_related('profile')</b>
# …
for register in registers:
profiles = register<b>.profile.all()</b>
我有以下3个型号:
class Platform(models.Model):
title = models.CharField(max_length=100, unique=True)
class Profile(models.Model):
title = models.CharField(max_length=110, unique=True)
platform = models.ManyToManyField(Platform)
class Register(models.Model):
...
profile = models.ManyToManyField(Profile)
...
我的views.py
def info(request):
...
registers=Register.objects.all()
...
for register in registers:
profile= register.profile....???
我需要通过 Register 模型的查询了解一个或多个配置文件
可以吗?
您可以获得所有与一个或多个registers
相关的Profile
s:
Profile.objects.filter(<b>register__in=registers</b>)
或者您可以获得 Register
对象的 Profile
:
def info(request):
# …
registers=Register.objects.all()
# …
for register in registers:
profiles = register<b>.profile.all()</b>
但在这里您将访问数据库 per register
,这可能无法很好地扩展。
您可以像 .prefetch_related(…)
[Django-doc] 一样,通过一个额外的查询在内存中获取所有这些相关的 Profile
,然后在 Django/Python 级别执行 JOIN:
def info(request):
# …
registers=Register.objects.<b>prefetch_related('profile')</b>
# …
for register in registers:
profiles = register<b>.profile.all()</b>