【问题标题】:how to change a char field to list field or array field in Django model?如何将 char 字段更改为 Django 模型中的列表字段或数组字段?
【发布时间】:2021-05-05 07:51:10
【问题描述】:

我希望将 Char 字段“device_id”更改为列表字段或数组字段,而不会丢失字段中存在的当前数据,因此它可以保存多个设备 ID。

class User(AbstractBaseUser, PermissionsMixin):
    id = ShortUUIDField(primary_key=True, editable=False)
    email = models.EmailField(verbose_name="email address", max_length=255, unique=True)
    phone = models.CharField(max_length=50, null=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    device_id = models.CharField(max_length=255, blank=True, null=True)

用例:我需要用户在这里与多个设备相关联

【问题讨论】:

  • 你需要创建一个Data migration
  • 我猜你需要ManyToMany 关系。如果是这样,我建议您创建一个新字段 devices = ManyToManyField(User) 并进行必要的迁移。然后编写一个简单的脚本来创建基于device_id 字段的关系。完成后,删除device_id字段。
  • @HarunYilmaz 是的,这就是我所需要的,但是如何将旧字段中的值获取到新字段中?,我是这里的新手,你能帮我解决这个问题吗?

标签: python django django-models django-rest-framework django-views


【解决方案1】:

首先,您需要为 Device 创建一个模型,如下所示:

class Device(models.Model)
    name = models.CharField(max_length=100)

然后您可以向用户模型添加一个新字段(不要删除旧的)。

device_ids = models.ManyToManyField(YouDeviceModel)

迁移数据库

py manage.py makemigrations
py manage.py migrate

然后在您的一个应用中添加当前文件(只是临时的)

management\
   __init__.py
   commands\
      __init__.py
      migrateuser.py

migrateuser.py内:

from django.core.management.base import BaseCommand
from django.contrib.auth.models import User
from yourapp.models import Device #your device model

class Command(BaseCommand):
    def handle(self, *args, **kwargs):
        users = User.objects.all()

        for user in users:
            device = Device.objects.create(name=user.device_id)
            user.device_ids.add(device)

在 shell 中运行py manage.py migrateuser

删除字段 device_id 并再次运行迁移。

【讨论】:

  • 最好是Data Migration,而不是管理命令。
  • 是的,这可能更好。如果它只是一次性的并且您还没有生产数据库,这将正常工作。但你是对的,数据迁移是一种更好的做法。
  • 收到此错误“未知命令:'migrateuser'。您的意思是迁移吗?”在运行 py manage.py migrateuser 时。
  • 应该是migrateuser。这是我们创建的自定义命令。您是否在每个文件夹中创建了 management/commands/migrateuser.py__init__.py 文件。这应该放在应用程序中。不直接在项目中。
  • @FelixEklöf 您没有正确显示发出管理命令的方法。您需要一个 Command 类,该类在文件中继承 BaseCommand。参考docs.djangoproject.com/en/3.2/howto/custom-management-commands...
猜你喜欢
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2011-02-04
相关资源
最近更新 更多