当修改元类以包含unique_together并尝试makemigrations时,我不断发现“没有检测到更改”,我认为这不是预期的行为。 错误#1
我确实尝试删除该特定模型和makemigration的迁移,但仍然不包含此元类属性。
实际上,我可以通过更改模型的其他方面强制迁移,然后手动编辑可用的migration.py。但是,当在tabularinline中使用模型并覆盖save_formset时,我得到“此Enum代码已存在的枚举值”。 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')]),
),
]
** Admin - tabularinline **
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
答案 0 :(得分:1)
您的EnumValue
班级有两个 Meta
个班级。这与重新分配变量一样:第一个类定义丢失,只剩下第二个类定义。您需要将这些合并为一个类。
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
答案 1 :(得分:0)
我认为原因是您的enum_code
字段本身已经unique=True
。因此,它与任何其他字段一起自动唯一,无需迁移,并且还解释了您的错误。