【问题标题】:When I open the model, one field value is replaced automatically当我打开模型时,会自动替换一个字段值
【发布时间】:2021-04-04 12:04:54
【问题描述】:

有一个愚蠢的问题:当我打开员工模型(在 django admin 中)时,一个字段 (employee_type) 值被自动替换,我知道为什么... 示例:我创建员工,将员工类型定义为经理,保存。在 DB 中,值是经理。之后,我打开员工并看到员工类型为下水道,如果我保存,该值将保存在数据库中。

我为此字段创建了文本选择,并且在 DB 字段中定义为枚举。 我试图研究这个问题,没有使用 DB 中的值,总是使用文本选择中的第一个值。

顺便说一句,我在其他模型中创建了相同的字段(数据库中的枚举和模型中的文本选择)。一切正常。

我该如何解决???

Models.py 有问题:

class Employee(models.Model):
    class EmployeeType(models.TextChoices):
        SEWER = 'SEWER', _('Sewer')
        MANAGER = 'MANAGER', _('Manager')
        UNDEFINED = 'UNDEFINED', _('Undefined')

    user = models.OneToOneField(User,
                                models.CASCADE,
                                db_column='user',
                                verbose_name=_('User'),
                                primary_key=True)
    employee_type = models.CharField(db_column='Employee type',
                                     verbose_name=_('Employee type'),
                                     max_length=9,
                                     choices=EmployeeType.choices,
                                     default=EmployeeType.UNDEFINED)
    phone = models.CharField(db_column='Phone',
                             verbose_name=_('Phone'),
                             max_length=255)
    work_xp = models.IntegerField(db_column='Work XP',
                                  verbose_name=_('Work XP'),
                                  blank=True,
                                  null=True)

另一个models.py。具有相同的字段但没有问题:

class Order(models.Model):
    class OrderStatus(models.TextChoices):
        CREATED = 'Created', _('Created')
        CANCELLED = 'Cancelled', _('Cancelled')
        IN_PROGRESS = 'In progress', _('In progress')
        COMPLETED = 'Completed', _('Completed')
        PASSED_TO_CLIENT = 'Passed to the client', _('Passed to the client')
        RETURNED_FOR_REWORK = 'Returned for rework', _('Returned for rework')

    class Urgency(models.TextChoices):
        LOW = 'Low', _('Low urgency')
        MEDIUM = 'Medium', _('Medium urgency')
        HIGH = 'High', _('High urgency')
        VERY_HIGH = 'Very high', _('Very high urgency')

    class LabourIntensity(models.TextChoices):
        LOW = 'Low', _('1-3 days')
        MEDIUM = 'Medium', _('4-6 days')
        HIGH = 'High', _('7-9 days')
        VERY_HIGH = 'Very high', _('10+ days')

    class PaymentStatus(models.TextChoices):
        PENDING = 'Pending payment', _('Pending payment')
        PREPAYMENT_MADE = 'Prepayment made', _('Prepayment made')
        PAID = 'Paid', _('Paid')

    id_service = models.ForeignKey(Service,
                                   models.SET_NULL,
                                   db_column='id_Service',
                                   verbose_name=_('Service'),
                                   blank=True,
                                   null=True)
    status = models.CharField(db_column='Status',
                              verbose_name=_('Status'),
                              max_length=20,
                              choices=OrderStatus.choices,
                              default=OrderStatus.CREATED)
    payment_status = models.CharField(db_column='Payment status',
                                      verbose_name=_('Payment status'),
                                      max_length=15,
                                      choices=PaymentStatus.choices,
                                      blank=True,
                                      null=True)
    prepayment = models.DecimalField(db_column='Prepayment',
                                     verbose_name=_('Prepayment'),
                                     max_digits=19,
                                     decimal_places=2,
                                     blank=True,
                                     null=True)
    cost = models.DecimalField(db_column='Cost',
                               verbose_name=_('Cost'),
                               max_digits=19,
                               decimal_places=2,
                               blank=True,
                               null=True)
    start_date = models.DateTimeField(db_column='Start date',
                                      verbose_name=_('Start date'),
                                      blank=True,
                                      null=True)
    end_date = models.DateTimeField(db_column='End date',
                                    verbose_name=_('End date'),
                                    blank=True,
                                    null=True)
    id_client = models.ForeignKey(Client,
                                  models.SET_NULL,
                                  db_column='id_Client',
                                  verbose_name=_('Client'),
                                  blank=True,
                                  null=True)
    id_employee = models.ForeignKey(Employee,
                                    models.SET_NULL,
                                    db_column='id_Employee',
                                    verbose_name=_('Employee'),
                                    blank=True,
                                    null=True)
    labour_intensity = models.CharField(db_column='Labour intensity',
                                        verbose_name=_('Labour intensity'),
                                        max_length=9,
                                        choices=LabourIntensity.choices,
                                        default=LabourIntensity.LOW)
    urgency = models.CharField(db_column='Urgency',
                               verbose_name=_('Urgency'),
                               max_length=9,
                               choices=Urgency.choices,
                               default=Urgency.LOW)
    materials = models.ManyToManyField(Material, through='OrderMaterials')
    comment = models.TextField(db_column='Comment',
                               verbose_name=_('Comment'),
                               blank=True,
                               null=True)

【问题讨论】:

  • 为什么employee_type的选择使用LabourIntensity,而不是EmployeeType?
  • @TimNyborg 我尝试通过这种方式进行调试,但在发布之前忘记返回初始代码。现在已经修复了

标签: django django-models


【解决方案1】:

我解决了这个问题。 在 DB 中,一种类型的字段“employee_type”被定义为:

ENUM('Undefined','Sewer','Manager')

但该模型有大写的 EmployeeType 选项。

解决方案:我将DB中字段类型的值小写改为大写:

ENUM('UNDEFINED','SEWER','MANAGER')

现在一切正常。

【讨论】:

    猜你喜欢
    • 2014-09-11
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多