[英]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_path
、 file_name
和libera_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.