Django - 元类

时间:2016-08-11 10:16:18

标签: django metaclass

当修改元类以包含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

2 个答案:

答案 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。因此,它与任何其他字段一起自动唯一,无需迁移,并且还解释了您的错误。