Django - 元 class
Django - meta class
在修改元 class 以包含 unique_together 并尝试进行迁移时,我不断收到 "No changes detected",我认为这不是预期的行为。 错误 #1
我确实尝试删除了该特定模型的迁移和 makemigration,但仍然不包括此元 class 属性。
我实际上可以通过更改模型的其他方面然后手动编辑有效的 migration.py 来强制迁移。但是,当在 tabularinline 中使用模型并覆盖 save_formset 我得到 "Enum value with this Enum code already exists".ERROR #2
Dirty message: Unique constraint screenshot
Model.py
class EnumValue(models.Model):
enum_code = models.CharField(max_length=16, unique=True)
enum_value_en = models.CharField(max_length=40, verbose_name='English VALUE')
lowercase_enum_value_en = models.CharField(max_length=500, db_index=True)
enum = models.ForeignKey(Enum, db_index=True, verbose_name='Enum')
created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
created_by = models.ForeignKey(User, related_name='enumvalue_created_by_user')
modified_by = models.ForeignKey(User, related_name='enumvalue_updated_by_user')
class Meta:
unique_together = (('enum_code', 'enum'),)
ordering = ('lowercase_enum_value_en',)
def __unicode__(self):
return self.enum_value_en
class Meta:
verbose_name_plural = 'Enum Values'
Migration.py
class Migration(migrations.Migration):
dependencies = [
('dq', '0031_enum_enumvalue'),
]
operations = [
migrations.AlterUniqueTogether(
name='enumvalue',
unique_together=set([('enum_code', 'enum')]),
),
]
**管理员 - 表格内联**
def save_formset(self, request, form, formset, change):
if formset.is_valid: # ensures no blank forms are submitted
instances = formset.save(commit=False) # gets instance from memory and add to it before saving it
for obj in formset.deleted_objects:
obj.delete()
for instance in instances:
instance.modified_by = request.user
instance.created_by = request.user
instance.lowercase_enum_value_en = instance.enum_value_en.lower() # no need to get clean data from "form"
instance.save()
formset.save()
我正在使用 Django v1.8.4
我认为原因是您的 enum_code
字段本身已经有 unique=True
。因此,它与任何其他字段一起自动是唯一的,无需迁移,您的错误也得到了解释。
您的 EnumValue
class 有 两个 Meta
class。这就像重新分配变量一样:第一个 class 定义丢失,只保留第二个 class 定义。您需要将它们合并成一个 class.
class EnumValue(models.Model):
...
class Meta:
unique_together = (('enum_code', 'enum'),)
ordering = ('lowercase_enum_value_en',)
verbose_name_plural = 'Enum Values'
def __unicode__(self):
return self.enum_value_en
在修改元 class 以包含 unique_together 并尝试进行迁移时,我不断收到 "No changes detected",我认为这不是预期的行为。 错误 #1
我确实尝试删除了该特定模型的迁移和 makemigration,但仍然不包括此元 class 属性。
我实际上可以通过更改模型的其他方面然后手动编辑有效的 migration.py 来强制迁移。但是,当在 tabularinline 中使用模型并覆盖 save_formset 我得到 "Enum value with this Enum code already exists".ERROR #2
Dirty message: Unique constraint screenshot
Model.py
class EnumValue(models.Model):
enum_code = models.CharField(max_length=16, unique=True)
enum_value_en = models.CharField(max_length=40, verbose_name='English VALUE')
lowercase_enum_value_en = models.CharField(max_length=500, db_index=True)
enum = models.ForeignKey(Enum, db_index=True, verbose_name='Enum')
created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
created_by = models.ForeignKey(User, related_name='enumvalue_created_by_user')
modified_by = models.ForeignKey(User, related_name='enumvalue_updated_by_user')
class Meta:
unique_together = (('enum_code', 'enum'),)
ordering = ('lowercase_enum_value_en',)
def __unicode__(self):
return self.enum_value_en
class Meta:
verbose_name_plural = 'Enum Values'
Migration.py
class Migration(migrations.Migration):
dependencies = [
('dq', '0031_enum_enumvalue'),
]
operations = [
migrations.AlterUniqueTogether(
name='enumvalue',
unique_together=set([('enum_code', 'enum')]),
),
]
**管理员 - 表格内联**
def save_formset(self, request, form, formset, change):
if formset.is_valid: # ensures no blank forms are submitted
instances = formset.save(commit=False) # gets instance from memory and add to it before saving it
for obj in formset.deleted_objects:
obj.delete()
for instance in instances:
instance.modified_by = request.user
instance.created_by = request.user
instance.lowercase_enum_value_en = instance.enum_value_en.lower() # no need to get clean data from "form"
instance.save()
formset.save()
我正在使用 Django v1.8.4
我认为原因是您的 enum_code
字段本身已经有 unique=True
。因此,它与任何其他字段一起自动是唯一的,无需迁移,您的错误也得到了解释。
您的 EnumValue
class 有 两个 Meta
class。这就像重新分配变量一样:第一个 class 定义丢失,只保留第二个 class 定义。您需要将它们合并成一个 class.
class EnumValue(models.Model):
...
class Meta:
unique_together = (('enum_code', 'enum'),)
ordering = ('lowercase_enum_value_en',)
verbose_name_plural = 'Enum Values'
def __unicode__(self):
return self.enum_value_en