繁体   English   中英

在 django 中使用 get_or_create 的正确方法是什么?

[英]whats the correct way of using get_or_create with django?

get_or_create 怎么会导致:

pymysql.err.IntegrityError:(1062,“重复条目'...blabla'键'描述符'”)

请看看我如何调用 get_or_create:

for key in keys:
    files_obj, created = Files.objects.get_or_create(file_path=key,
                                                     file_name=Path(key).name,
                                                     libera_backend=resource_object)
    if created:
        files_obj_uuids.append(files_obj.pk)
        resource_objects.append(resource_object.pk)

另请查看我的文件模型:

class Files(models.Model):
    objects = RandomManager()
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    libera_backend = models.ForeignKey(LiberaBackend, on_delete=models.CASCADE, related_name='libera_backend_relation')
    descriptor = models.TextField(verbose_name="File Descriptor", blank=True, null=True, editable=False, max_length=1000, unique=True)
    file_path = models.TextField(verbose_name="File Path", blank=False, null=False, editable=False, max_length=1000, unique=True)
    file_name = models.TextField(verbose_name="File Name", blank=False, null=False, max_length=1000, editable=False)
    date_added = models.DateTimeField(auto_now_add=True, blank=True, verbose_name="Date Added")

提前致谢

这里的问题可能涉及您使用主键(或唯一约束)的方式。 在您的模型中, file_path字段可能是唯一的,这意味着没有两行可以具有相同的值。

当您使用get_or_create时,您传入的字段首先在“where”子句中一起使用,有效地做同样的事情:

files = Files.objects.filter(file_path=key,
                             file_name=Path(key).name,
                             libera_backend=resource_object)
if not files.exists():
  files = Files(file_path=key
                file_name=Path(key).name,
                libera_backend=resource_object)
...

现在在第一个filter上,您什么也得不到,因为没有记录匹配所有三个字段,所以您尝试使用file_path=key创建一个新的 Files 对象,该对象会出错,​​因为它违反了该字段的约束.

解决方案可能是更改模型以删除 file_path 约束,或者将唯一约束设置file_pathfile_namelibera_backend的组合。 或者,您可以在get_or_create中使用默认参数:

files_obj, created = Files.objects.get_or_create(file_path=key,
                                                 defaults={'file_name': Path(key).name,                                      
                                                           'libera_backend': resource_object})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM