使用Django中现有的用户创建从User继承的对象

时间:2018-09-24 08:48:00

标签: django django-models django-orm

我有这样的用户模型

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界面中创建帐户,我会做同样的事情。由于AUserBUser继承了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模型不是一个好主意,但它是一个正在运行的项目。所以我不能改变我的结构。

1 个答案:

答案 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