由于一个一个字段(我想)导致的无法解释的结果
看看下面我的问题
终端输出:
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'}
我相信您正在寻找AUTH_USER_MODEL
您已经指定了
AUTH_PROFILE_MODEL
,但只要不指定AUTH_USER_MODEL
,Django将只使用其内置的用户模型。你知道吗编辑:
不幸的是,我无法深入证明,但django似乎是在主键的基础上构造外键关系查询。所以实际上
变得类似于:
但是由于
id=2
forjlennon@beatles.com
当它与您的tbl_users
匹配时,它获取与id2
对应的对象,即Aniket
。这就是这种奇怪行为的原因。我相信在Users模型中设置email as PK应该可以解决这个问题。你知道吗如何证明?你知道吗
您可以尝试运行控制台中执行的操作,并将
.query
添加到控制台中,以查找Django运行的确切sql查询。在本例中,对于ex:User.objects.get(email='jlennon@beatles.com').profile.query
,它必须类似于上面的查询。你知道吗希望这有帮助。还要考虑到AUTH_PROFILE_MODULE是折旧的。考虑到你的情况,我把这个留给你。你知道吗
相关问题 更多 >
编程相关推荐