Django 后台管理系统model数据刷新问题

Django 后台管理系统model数据刷新问题

问题描述:

现在有数据表如下,表中有字段是根据其他表来填写的,我做了一个choices来做下拉框,可是现在有问题就是用户新注册后,地址栏没有数据,重启django后地址栏才会有数据

# 用户表
class Userinfo(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16, verbose_name='名字')
    code = models.CharField(max_length=16, verbose_name='工号', null=True, blank=True, unique=True)
    password = models.CharField(max_length=88, verbose_name='密码')
    isenable = models.BooleanField(default=False, verbose_name='是否启用')
    try:
        choices = [(i.ID, i.getaddressname) for i in addresschildren.objects.all()]
    except Exception as e:
        print(e)
        choices = []
    address_id = models.IntegerField(verbose_name='用户注册地', null=True, blank=True, choices=choices)
    try:
        choices = [(i.ID, i.Name) for i in address.objects.all()]
    except:
        choices = []
    super_address_id = models.IntegerField(verbose_name='用户管理范围', null=True, blank=True, choices=choices)
    config = configparser.ConfigParser()

    try:
        config.read(configsys.objects.get(name="config").value)
    except ObjectDoesNotExist:
        path = r'apps/config/config.ini'
        config.read(path)
    except Exception:
        path = r'apps/config/config.ini'
        config.read(path)
    choices = [(int(i[-1]), i[0]) for i in config.items('jurisdiction')]
    super_number = models.IntegerField(verbose_name='用户管理权限', null=True, blank=True, choices=choices, default=1)

新地址,新用户,地址栏无显示

img


下拉菜单也无法找到刚刚注册的地址

img

重启django后

img

img

请问该如何让django数据库中数据更新后能实时拿到数据并在这个方法中显示

参考: python - Dynamic choices field in Django Models - Stack Overflow My models.py: SHOP1_CHOICES = ( ('Food Court', 'Food Court'), ('KFC', 'KFC'), ) SHOP2_CHOICES = ( ('Sports Arena', 'Sports Arena'), ('Disco D', 'Disco D'), ) SHOP3_CHOICES = ( ... https://stackoverflow.com/questions/6001986/dynamic-choices-field-in-django-models/12005426#12005426
可以试试在Userinfo类下建立 init 构造方法
这样好像在每次调用都会根据另一个数据表刷新choices

class Userinfo(models.Model):
    ...
    ...
  def __init__(self, *args, **kwargs):
    super(Userinfo, self).__init__(*args, **kwargs)
    self._meta.get_field('address_id').choices = addresschildren.objects.all().values_list('field_name','field_name')

choices = [(i.ID, i.getaddressname) for i in addresschildren.objects.all()]

这样的代码可以看出,问题非常大,我不知道你是在哪学习Django的,如果需要帮助的话可以加我,我从15年开始使用Django,而且为DRF框架贡献过代码。


class内的代码定义了model,没错,但是这样的定义代码【只在Python运行的时候执行1次】

比如第九行choices = [(i.ID, i.getaddressname) for i in addresschildren.objects.all()]
Django刚启动时候choices有多少,后面就永远有多少,除非重新启动,【重新执行这一行】
在没有重启的时候,通过网页添加了多少addresschildren,都不会【动态更新】
这种数据表的关联关系,Django 有专门的用法,比如ForeignKey、ManyToManyRel

class Address(models.Model):
    detail = models.CharField("详细地址", max_length=200, default="")

    def __str__(self):
        return self.detail


# 用户表
class Userinfo(models.Model):
    name = models.CharField("昵称", max_length=200)
    address = models.ForeignKey(Address, related_name="地址", on_delete=models.DO_NOTHING)  # 关联另一个model

效果如下,关键是 【下拉选择框的内容,会根据数据库的情况,实时变化】

img


最后再多说一点
为什么要用class定义model?
因为class映射是数据表,object映射数据表中的数据,也就是说数据应该是一个个的object,而不是class

model应该只定义数据的scheme,而无关具体的值