【问题标题】:Best way to mange user information into two tables using OneToOne Realtion in django在 django 中使用一对一关系将用户信息管理到两个表中的最佳方法
【发布时间】:2020-02-11 02:45:58
【问题描述】:

请指导并建议我解决此问题的最佳方法。

我有一个用户信息表:

第一: 用户名、名字、姓氏、电子邮件、密码[由 django 提供]

第二: mobile、parent_id 和其他用户个人资料相关详细信息[要创建]


目标: 我想要带有一些字段的 second table 并通过 OneToOne 关系auth_user (django 提供的名称)连接,这样我就可以获取所有通过一个对象进行场。


我的尝试

1 箱
我创建了第二个表并与 FK 关系连接并从以前的数据库下载所有以前的数据并手动拆分数据并通过 CSV 上传到新表中。

问题:我无法通过单个对象访问两个表数据。

第二种情况 所以我用 OneToOne 关系更新了第二个表。

问题:添加具有这种关系的新用户非常好,但是当尝试编辑/更改以前保存的数据时出现错误

错误:在模型更改期间 int() 以 10 为底的无效文字

注意:上表中的数百个用户,只需使用新的数据库架构安全迁移即可。

请给我一个棘手的想法来解决这个问题。

谢谢大家。

向救世主致敬。


code:

views.py [file]

...
@login_required()
def register(request, epin):
    EPin = apps.get_model('epin', 'EPin')
    if EPin.objects.filter(epin__exact=epin, is_active=1,
                           assigned_to=request.user.username).exists():
        form = RegistrationForm()
        if request.method == 'POST':
            form = RegistrationForm(request.POST)
            if form.is_valid():
                if User.objects.filter(username__exact=request.POST['parent_id']).exists():
                    try:
                        with transaction.atomic():
                            username = generate_username()
                            password = generate_password()
                            EPin.objects.filter(epin__exact=epin,
                                                is_active=1).update(used_by=username, is_active=0,
                                                                    used_at=datetime.now())
                            Profile(mobile=request.POST['mobile'],
                                    leg=request.POST['leg'],
                                    product_id=request.POST['product'],
                                    parent_id=request.POST['parent_id'],
                                    user_id=username).save()

                            User.objects.create_user(username=username, password=password,
                                                     email=request.POST['email'],
                                                     first_name=request.POST['first_name'],
                                                     last_name=request.POST['last_name'])

                            logging.getLogger('info_logger').info('U : '+username+' P : '+password)
                    except Exception as e:
                        messages.warning(request, e)
                        logging.getLogger('error_logger').error(e)
                    # try:
                    #     user_msg = 'Username :' + username + ' and Password : ' + password
                    #     send_mail('Successfully registered ', user_msg,
                    #               'no-reply@example.in', [request.POST['email']])
                    # except Exception as e:
                    #     messages.warning(request, e)
                    #     logging.getLogger('error_logger').error(e)
                    # try:
                    #     user_msg = 'Username :' + username + ' and Password : ' + password
                    #     send_message(user_msg, request.POST['mobile'])
                    # except Exception as e:
                    #     messages.warning(request, e)
                    #     logging.getLogger('error_logger').error(e)

                    messages.success(request,
                                     'New User successfully created!, Username and password sent on mobile and email.')
                    return redirect('epin')
                else:
                    messages.warning(request, 'Invalid Sponsor ID, User not exists')
        return render(request, 'users/register.html', {'form': form})
    else:
        messages.warning(request, 'Not a valid E-Pin -- ' + epin)
        logging.getLogger('error_logger').error(epin+' not valid')
        return redirect('epin')



models.py [file]

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    # user_id = models.CharField(max_length=10)
    mobile = models.CharField(max_length=20)
    parent_id = models.CharField(max_length=10)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


    def __str__(self):
        return f'{self.user.username}'

【问题讨论】:

  • 我认为案例 2 最适合您的情况。您可以在尝试更新数据的地方上传 modles.py 和 views.py。
  • @sandeep 我刚刚添加了我使用过的代码,但我只想“注意:上表中有数百个用户,只需使用新的数据库架构安全迁移即可。”
  • 1) 配置文件模型中的“用户”,您正在使用“用户 ID”保存。 2)您不应该像现在这样保存密码。 3)views.py 令人困惑。你能上传整个函数吗?
  • @sandeep 把整个函数加进去了,搞砸了兄弟,希望你能理解。

标签: django django-models mysql-python table-relationships db-schema


【解决方案1】:

要将 Django 的用户模型关联为另一个模型中的外键,请使用以下命令:

from django.contrib.auth.models import User
from django.contrib.auth import get_user_model

user = models.ForeignKey(get_user_model(), help_text="User", blank=True, null=True, on_delete=models.CASCADE)

【讨论】:

  • 这很有帮助,但我的需求不同,如果将字段类型从 CharacterField 更新为 FK 或 OneToOne,那么如何使用现有数据进行管理。谢谢,弗朗西斯科
  • 1.生成一个新的 FK 字段。 2. 使您的逻辑从现有字段中填充这些字段。 3.删除旧字段
  • 感谢您的回复,我也是这样做的。
猜你喜欢
  • 2021-09-25
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
相关资源
最近更新 更多