【问题标题】:Modifying entry in django admin creates duplicate在 django admin 中修改条目会创建重复项
【发布时间】:2014-04-20 08:32:24
【问题描述】:

我正在使用 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 表架构:

这是一种非常违反直觉的行为,我还没有在网上发现任何其他这种情况。对此的任何帮助将不胜感激。

【问题讨论】:

    标签: mysql django django-models django-admin


    【解决方案1】:

    这是罪魁祸首:

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

    由于您已将物种定义为主键,因此每当您在管理员中更改此字段时,它都会创建一个新记录(因为还没有具有该主键的记录)。

    仅供参考,主键不应该是改变给定记录的东西,因为更改主键会使引用记录的每个外键(ForeignKeyOneToOneFieldManyToManyField)无效.

    顺便说一句,您不需要在字段名称前加上ai_species_;它很混乱。删除这些前缀也将不再需要 db_column 参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-15
      • 2016-05-29
      • 2021-02-27
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      相关资源
      最近更新 更多