修改django admin中的条目会创建重复项

时间:2014-03-14 20:42:07

标签: mysql django django-models django-admin

我使用django管理员修改表中的记录。问题是每当我修改一个条目时,当我点击保存而不是修改该条目时,旧的条目不会被修改,并且正在添加包含修改后的细节的新条目。

例如,如果我有以下内容:

Aardvark | Orycteropus | Some description | aardvark | animals/images/aardvark.jpg

当我将第一个字段更改为Aardvarkon时,我得到以下内容:

Aardvark | Orycteropus | Some description | aardvark | animals/images/aardvark.jpg
Aardvarkon | Orycteropus | Some description | aardvark | animals/images/aardvark.jpg

我有以下django模型:

def article_file_name(instance, filename):
    return ANIMAL_IMAGES_BASE_DIR[1:] + instance.ai_species_species_sanitized + '.jpg'

class ai_species(models.Model):
    ai_species_species = models.CharField('Species', max_length=100, primary_key=True, db_column='species')
    ai_species_genus = models.ForeignKey(ai_genera, max_length=50, blank=False, null=False, db_column='genus')
    ai_species_description = models.CharField('Description', max_length=65000, db_column='description')
    ai_species_species_sanitized = models.CharField(max_length=100, blank=False, null=False, db_column='species_sanitized')
    image_url = models.ImageField(max_length=100, storage=OverwriteStorage(), validators=[validate_jpg_extension], upload_to=article_file_name)

    class Meta:
        db_table = 'Species'
        verbose_name = 'Animal species'
        verbose_name_plural = 'Animal species'
    def __unicode__(self): # Required, don't remove.
        return self.ai_species_species

以下帮助者:

def validate_jpg_extension(value):
    if not value.name.lower().endswith('.jpg') and not value.name.lower().endswith('.jpeg'):
        raise ValidationError(u'Invalid file format! Only jpg or jpeg files allowed!')

class OverwriteStorage(FileSystemStorage):
    def get_available_name(self, name):
        # If the filename already exists, remove it.
        if self.exists(name):
            os.remove(os.path.join(settings.MEDIA_ROOT, name))
        return name

这是此表的MySQL表架构:

Table schema

这是一种非常反直觉的行为,我没有在网上发现任何此类事件。对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

这是罪魁祸首:

 ai_species_species = models.CharField('Species', max_length=100, primary_key=True, db_column='species')

由于您已将物种定义为主键,因此每次在管理员中更改此字段时,它都会创建一条新记录(因为该主键尚未记录)。 / p>

仅供参考,主键不应该是针对给定记录而更改的内容,因为更改主键将使每个外键无效(ForeignKeyOneToOneField和{{1 }})指的是记录。

顺便说一句,你不需要在ManyToManyField之前添加字段名称前缀;它很混乱。删除这些前缀也将消除对ai_species_参数的需求。