我有这样的用户模型
from django.contrib.auth.models import User
class AUser(User):
# some model properties
class BUser(User):
# some model properties
此处AUser
具有不同的Web界面,而BUser
具有不同的Web界面。如果用户在AUser
界面中注册,我将为他创建一个这样的用户。
auser = AUser.objects.create(username='abc', first_name='abc', last_name='cdf', email='abc@gmail.com')
auser.set_password('asdf12345')
对于在BUser
界面中创建帐户,我会做同样的事情。由于AUser
和BUser
继承了User
模型,因此它们具有字段user_ptr
,该字段实际上是User
对象。
问题是,如果用户已经在AUser
界面中拥有帐户,那么如果他尝试在BUser
界面中使用相同的凭据登录,我将自动为他创建BUser
对象但具有相同的凭据。这意味着我将不会创建User
对象,但会在现有的BUser
对象上附加一个User
对象。但是我找不到找到这样的对象的方法。我试图这样做
user = User.objects.get(id=123)
buser = BUser.objects.create(user_ptr=user)
但是它尝试使用默认值创建新的User
对象。在这种情况下,如何使用现有的BUser
对象创建一个新的User
对象?
PS:虽然继承User
模型不是一个好主意,但它是一个正在运行的项目。所以我不能改变我的结构。
答案 0 :(得分:0)
我不得不使用原始sql查询来执行此操作,因为我找不到使用Django ORM进行此操作的方法。我是这样做的。
def insert_with_raw_query(table, data):
values_keys = ','.join(data.keys())
data_values = ''
for v in data.values():
if v == 'TRUE' or v == 'FALSE':
data_values += ('%s,' % v)
else:
if isinstance(v, str):
data_values += ("'%s'," % v)
else:
data_values += ('%s,' % str(v))
insert_query = 'INSERT INTO "app_{table}"({values_keys}) VALUES ({data});'.format(
table=table.lower(),
values_keys=values_keys,
data=data_values[:-1])
with connection.cursor() as cursor:
cursor.execute(insert_query)
return True