gpt4 book ai didi

mysql - 在 django admin 中修改条目会创建重复项

转载 作者:太空宇宙 更新时间:2023-11-03 12:15:30 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

这是罪魁祸首:

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

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

仅供引用,主键不应该是针对给定记录更改的内容,因为更改主键会使每个外键无效(ForeignKeyOneToOneField、和 ManyToManyField) 引用记录。

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

关于mysql - 在 django admin 中修改条目会创建重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22415360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com