Django个人资料模型:奇怪的错误:扩展Auth用户模型

2024-10-02 16:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

由于一个一个字段(我想)导致的无法解释的结果

看看下面我的问题

终端输出:

In [21]: profile = User.objects.get(email='jlennon@beatles.com')
In [22]: profile
Out[22]: <User: jlennon@beatles.com>

In [23]: profile = User.objects.get(email='jlennon@beatles.com').profile

In [24]: profile
Out[24]: <Users: Aniket>
In [25]: profile = User.objects.get(id=2).profile

In [26]: profile
Out[26]: <Users: Aniket>

In [27]: User.objects.get(id=2)
Out[27]: <User: jlennon@beatles.com>

In [28]: User.objects.get(id=4)
Out[28]: <User: AniketYadav>

型号.py:

class Users(models.Model):
    user = models.OneToOneField(User, related_name='profile')
    user_Id = models.BigAutoField(primary_key=True)
    user_name = models.CharField(max_length=25)
    user_fname = models.CharField(max_length=40, blank=True, null=True)
    user_lname = models.CharField(max_length=40, blank=True, null=True)
    user_email = models.CharField(max_length=60)
    user_password = models.CharField(max_length=255)
    joining_date = models.DateTimeField()
    user_dob = models.DateField()
    user_country = models.CharField(max_length=3, blank=True, null=True)
    user_gender = models.CharField(max_length=1)
    user_pic = models.CharField(max_length=255, blank=True, null=True)
    user_about = models.CharField(max_length=512, blank=True, null=True)

    class Meta:
        verbose_name = 'Users'
        verbose_name_plural = 'Users'
        managed = False
        db_table = 'tbl_users'

    def __unicode__(self):
        return self.user_name

    def __str__(self):
        return self.user_name

设置.py

AUTH_PROFILE_MODULE = 'myWebsite.Users'

我的数据库:

mysql> select id, username, email from auth_user where id=1 or id=2 or id=4;
+----+---------------------+---------------------+
| id | username            | email               |
+----+---------------------+---------------------+
|  1 | admin               | admin@admin.com     |
|  2 | jlennon@beatles.com | jlennon@beatles.com |
|  4 | AniketYadav         | aniket@gmail.com    |
+----+---------------------+---------------------+
3 rows in set (0.00 sec)

我的用户表(tbl\U用户):

+---------+-----------+------------------------------+
| user_id | user_name | user_email                   |
+---------+-----------+------------------------------+
|       2 | Aniket    | aniket@gmail.com             |
|       3 | Crazy     | crazy@crazy.com              |
+---------+-----------+------------------------------+
2 rows in set (0.00 sec)

我想因为我在tbl_users中没有用户,所以可能会得到错误的输出。我说的对吗??你知道吗

在我的应用程序models.py中,如何将User表从django.contrib.auth.mmodels链接到Users?你知道吗

我想以上问题的答案可能会让我明白,我应该如何着手制作个人资料模型。你知道吗

tbl_users表来自一个旧的PHP项目,我不想放弃它,这就是为什么它的模型中仍然有user_password字段(因为它是使用inspectdb导入的)。你知道吗

然而,我将移动到创建配置文件,同时注册,因为我已经阅读了某处使,我想这样我就不必担心这个问题,因为这样我就会有配置文件对象的每个配置文件。你知道吗

但我仍然想知道如何在当前的情况下纠正,我做错了什么?你知道吗


编辑:

建议更改的新用户

class Users(models.Model):
    user = models.OneToOneField(User, related_name='profile')
    user_Id = models.IntegerField()
    user_name = models.CharField(max_length=25)
    user_fname = models.CharField(max_length=40, blank=True, null=True)
    user_lname = models.CharField(max_length=40, blank=True, null=True)
    user_email = models.CharField(primary_key=True, max_length=60)
    user_password = models.CharField(max_length=255)
    joining_date = models.DateTimeField()
    user_dob = models.DateField()
    user_country = CountryField()
    user_gender = models.CharField(max_length=1)
    user_pic = models.CharField(max_length=255, blank=True, null=True)
    user_about = models.CharField(max_length=512, blank=True, null=True)

    class Meta:
        verbose_name = 'Users'
        verbose_name_plural = 'Users'
        managed = False
        db_table = 'tbl_users'

    def __unicode__(self):
        return self.user_name

    def __str__(self):
        return self.user_name

MySQL表说明

mysql> desc tbl_users;
+---------------+--------------+------+-----+------------------------------+-------+
| Field         | Type         | Null | Key | Default                      | Extra |
+---------------+--------------+------+-----+------------------------------+-------+
| user_id       | int(11)      | NO   |     | NULL                         |       |
| user_name     | varchar(25)  | NO   |     | NULL                         |       |
| user_fname    | varchar(40)  | YES  |     | NULL                         |       |
| user_lname    | varchar(40)  | YES  |     | NULL                         |       |
| user_email    | varchar(60)  | NO   | PRI | NULL                         |       |
| user_password | varchar(255) | NO   |     | NULL                         |       |
| joining_date  | datetime     | NO   |     | NULL                         |       |
| user_dob      | date         | NO   |     | NULL                         |       |
| user_country  | varchar(3)   | YES  |     | NULL                         |       |
| user_gender   | char(1)      | NO   |     | NULL                         |       |
| user_pic      | char(255)    | YES  |     | ../images/provideAnImage.jpg |       |
| user_about    | varchar(512) | YES  |     | NULL                         |       |
+---------------+--------------+------+-----+------------------------------+-------+
12 rows in set (0.00 sec)

但我得到的结果仍然是:

In [4]: User.objects.get(email='aniket@gmail.com').profile
Out[4]: <Users: Apurva>
In [5]: User.objects.get(email='jlennon@beatles.com')
Out[5]: <User: jlennon@beatles.com>

In [6]: User.objects.get(email='jlennon@beatles.com').profile
Out[6]: <Users: Aniket>

当我试图看到后面的查询时:

In [7]: User.objects.get(email='jlennon@beatles.com').profile.query
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-201041bc7f1c> in <module>()
----> 1 User.objects.get(email='jlennon@beatles.com').profile.query

AttributeError: 'Users' object has no attribute 'query'

In [8]: User.objects.filter(email='jlennon@beatles.com').profile.query
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-c4827b8b2ee1> in <module>()
----> 1 User.objects.filter(email='jlennon@beatles.com').profile.query

AttributeError: 'QuerySet' object has no attribute 'profile'

In [9]: User.objects.filter(email='jlennon@beatles.com').query
Out[9]: <django.db.models.sql.query.Query at 0x7fefe8741f90>

所以我找到了另一个选择

但是请告诉我一个更好的方法…

In [10]: for conn in connection.queries:
    ...:     print str(conn)+"\n\n"
    ...:     
{u'time': u'0.000', u'sql': u'SELECT @@SQL_AUTO_IS_NULL'}


{u'time': u'0.000', u'sql': u'SELECT VERSION()'}


{u'time': u'0.000', u'sql': u"SELECT `auth_user`.`id`, `auth_user`.`password`, `auth_user`.`last_login`, `auth_user`.`is_superuser`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`date_joined` FROM `auth_user` WHERE `auth_user`.`email` = 'pushpenderyadav145@gmail.com'"}


{u'time': u'0.000', u'sql': u'SELECT `tbl_users`.`user_id`, `tbl_users`.`user_Id`, `tbl_users`.`user_name`, `tbl_users`.`user_fname`, `tbl_users`.`user_lname`, `tbl_users`.`user_email`, `tbl_users`.`user_password`, `tbl_users`.`joining_date`, `tbl_users`.`user_dob`, `tbl_users`.`user_country`, `tbl_users`.`user_gender`, `tbl_users`.`user_pic`, `tbl_users`.`user_about` FROM `tbl_users` WHERE `tbl_users`.`user_id` = 4'}


{u'time': u'0.000', u'sql': u"SELECT `auth_user`.`id`, `auth_user`.`password`, `auth_user`.`last_login`, `auth_user`.`is_superuser`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`date_joined` FROM `auth_user` WHERE `auth_user`.`email` = 'jlennon@beatles.com'"}


{u'time': u'0.000', u'sql': u"SELECT `auth_user`.`id`, `auth_user`.`password`, `auth_user`.`last_login`, `auth_user`.`is_superuser`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`date_joined` FROM `auth_user` WHERE `auth_user`.`email` = 'jlennon@beatles.com'"}


{u'time': u'0.000', u'sql': u'SELECT `tbl_users`.`user_id`, `tbl_users`.`user_Id`, `tbl_users`.`user_name`, `tbl_users`.`user_fname`, `tbl_users`.`user_lname`, `tbl_users`.`user_email`, `tbl_users`.`user_password`, `tbl_users`.`joining_date`, `tbl_users`.`user_dob`, `tbl_users`.`user_country`, `tbl_users`.`user_gender`, `tbl_users`.`user_pic`, `tbl_users`.`user_about` FROM `tbl_users` WHERE `tbl_users`.`user_id` = 2'}


{u'time': u'0.000', u'sql': u"SELECT `auth_user`.`id`, `auth_user`.`password`, `auth_user`.`last_login`, `auth_user`.`is_superuser`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`date_joined` FROM `auth_user` WHERE `auth_user`.`email` = 'jlennon@beatles.com'"}


{u'time': u'0.000', u'sql': u'SELECT `tbl_users`.`user_id`, `tbl_users`.`user_Id`, `tbl_users`.`user_name`, `tbl_users`.`user_fname`, `tbl_users`.`user_lname`, `tbl_users`.`user_email`, `tbl_users`.`user_password`, `tbl_users`.`joining_date`, `tbl_users`.`user_dob`, `tbl_users`.`user_country`, `tbl_users`.`user_gender`, `tbl_users`.`user_pic`, `tbl_users`.`user_about` FROM `tbl_users` WHERE `tbl_users`.`user_id` = 2'}

Tags: namecomauthidtruemodelsemailprofile
1条回答
网友
1楼 · 发布于 2024-10-02 16:33:46

我相信您正在寻找AUTH_USER_MODEL

您已经指定了AUTH_PROFILE_MODEL,但只要不指定AUTH_USER_MODEL,Django将只使用其内置的用户模型。你知道吗

编辑:

不幸的是,我无法深入证明,但django似乎是在主键的基础上构造外键关系查询。所以实际上

User.objects.get(email='jlennon@beatles.com').profile 

变得类似于:

SELECT tu.id FROM auth_user as au JOIN tbl_users as tu ON au.id=tu.id WHERE au.email='jlennon@beatles.com';

但是由于id=2for jlennon@beatles.com当它与您的tbl_users匹配时,它获取与id 2对应的对象,即Aniket。这就是这种奇怪行为的原因。我相信在Users模型中设置email as PK应该可以解决这个问题。你知道吗

如何证明?你知道吗

您可以尝试运行控制台中执行的操作,并将.query添加到控制台中,以查找Django运行的确切sql查询。在本例中,对于ex:User.objects.get(email='jlennon@beatles.com').profile.query,它必须类似于上面的查询。你知道吗

希望这有帮助。还要考虑到AUTH_PROFILE_MODULE是折旧的。考虑到你的情况,我把这个留给你。你知道吗

相关问题 更多 >