【问题标题】:django queryset of two models两个模型的django查询集
【发布时间】:2016-07-16 17:26:24
【问题描述】:

我有两个模型:

class AuthUser(models.Model):
    id = models.IntegerField(primary_key=True) 
    password = models.CharField(max_length=128)
    last_login = models.DateTimeField(blank=True, null=True)
    is_superuser = models.BooleanField()
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.CharField(max_length=254)
    is_staff = models.BooleanField()
    is_active = models.BooleanField()
    date_joined = models.DateTimeField()
    username = models.CharField(unique=True, max_length=30)

    class Meta:
        managed = False
        db_table = 'auth_user'

class SocialAuthUsersocialauth(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    provider = models.CharField(max_length=32)
    uid = models.CharField(max_length=255)
    user = models.ForeignKey(AuthUser, models.DO_NOTHING)
    extra_data = models.TextField()

    class Meta:
        managed = False
        db_table = 'social_auth_usersocialauth'
        unique_together = (('provider', 'uid'),)

我需要在它们之间进行类似 SQL JOIN 的操作,并将连接的表存储在查询集中。

我尝试过这样做:

def namedtuplefetchall(cursor):
    desc = cursor.description
    nt_result = namedtuple('Result', [col[0] for col in desc])
    return [nt_result(*row) for row in cursor.fetchall()]

def examp(request):
    context = dict()
    cursor = connection.cursor()
    cursor.execute("""
    SELECT *
    FROM auth_user
    JOIN social_auth_usersocialauth
    ON auth_user.id = social_auth_usersocialauth.user_id
    """)
    context['usersauth'] = namedtuplefetchall(cursor)
    return render(request, 'try.html', context)

但我遇到了异常遇到重复的字段名称:'id',我不知道如何处理。

【问题讨论】:

    标签: python django


    【解决方案1】:

    应该在 namedtuple 调用中添加 rename=True 属性

    namedtuple('Result', [col[0] for col in desc], rename=True)
    

    【讨论】:

      【解决方案2】:

      您应该将select_relatedprefetch_related 用于这些目的。
      当你想从相关模型中获取表时,使用'select_related':

      SocialAuthUsersocialauth.objects.select_related('user')  
      

      当你想获取所有相关表时,使用'prefetch_related':

      AuthUser.objects.prefetch_relatd('socialauthusersocialauth_set')  
      

      它将向您的查询集添加额外的属性,以及相关字段的名称。最好在ForeignKey 中添加属性related_name 以获得更明确的用法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-15
        • 2020-01-11
        • 2013-10-10
        • 1970-01-01
        • 2023-04-09
        • 2010-09-26
        • 2018-12-04
        相关资源
        最近更新 更多