我使用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表架构:
这是一种非常反直觉的行为,我没有在网上发现任何此类事件。对此的任何帮助将不胜感激。
答案 0 :(得分:3)
这是罪魁祸首:
ai_species_species = models.CharField('Species', max_length=100, primary_key=True, db_column='species')
由于您已将物种定义为主键,因此每次在管理员中更改此字段时,它都会创建一条新记录(因为该主键尚未记录)。 / p>
仅供参考,主键不应该是针对给定记录而更改的内容,因为更改主键将使每个外键无效(ForeignKey
,OneToOneField
和{{1 }})指的是记录。
ManyToManyField
之前添加字段名称前缀;它很混乱。删除这些前缀也将消除对ai_species_
参数的需求。