【问题标题】:Many-to-Many relationship in DjangoDjango中的多对多关系
【发布时间】:2020-12-23 05:52:54
【问题描述】:

我有以下 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)
    ...

我的意见.py

def info(request):
    ...
    registers=Register.objects.all()
    ...
    for register in registers:
        profile= register.profile....???

我需要从注册模型的查询中知道配置文件或配置文件

有可能吗?

【问题讨论】:

    标签: python django django-models m2m


    【解决方案1】:

    您可以通过以下方式获得所有与一个或多个registers相关的Profiles:

    Profile.objects.filter(<b>register__in=registers</b>)

    或者你可以获得Register对象的Profiles:

    def info(request):
        # …
        registers=Register.objects.all()
        # …
        for register in registers:
            profiles = register.profile.all()

    但在这里您将访问数据库per register,它可能无法很好地扩展。

    您可以像@IainShelvington says 一样,使用.prefetch_related(…) [Django-doc] 通过一个额外的查询在内存中获取所有这些相关的Profiles,并在Django/Python 级别执行JOIN:

    def info(request):
        # …
        registers=Register.objects.prefetch_related('profile')
        # …
        for register in registers:
            profiles = register.profile.all()

    【讨论】:

    • Register.objects.prefetch_related('profile_set') 将消除重复的数据库调用
    • 如果我使用register.profile_set.all(),我会收到以下错误:AttributeError: 'Register' object has no attribute 'profile_set'
    • @DavidCastro:您是否在ManyToManyField 中指定了related_name
    • 不,我有profile= models.ManyToManyField(Profile)
    • @DavidCastro:没关系,我看错了。然后是register.profile.all()。但是,您可能希望将 profile 重命名为 profiles(复数形式),因为它是 Profile 对象的 集合
    最近更新 更多