按自然键过滤?
Filtering by natural key?
我没有我想要的对象的 ID,因为它们是由 bulk_create
创建的:并且 bulk_create
没有 return 具有 ID 的对象,所以我需要获取他们通过他们的自然键。
是否可以通过自然键过滤来获取对象?我在文档中没有找到任何内容。
我们已经可以做到:
id_list = [10,3,5,34]
MyModel.objects.filter(id__in=id_list)
我想要与自然键相同的东西:
NK_list = [('bob','carpenter'),('jack','driver'),('Leslie','carpenter')]
chosen_persons = Person.objects.filter(natural_key__in=NK_list)
我的模型是这样的:
class PersonManager(models.Manager):
def get_by_natural_key(self, name, job):
return self.get(name=name, job=job)
class Person(Models.model):
name = models.CharField(max_length=200)
job = models.CharField( max_length=200)
objects = PersonManager()
class Meta:
unique_together = [['name', 'job']]
def natural_key(self):
return (self.name, self.job)
--编辑--
最终我找到了一个更快的解决方案来取回 bulk_created
创建的对象:按最后创建的对象过滤!我比较了这与通过自然键获取对象之间的时间,它确实更快。
你可以这样做:
NK_list = [('bob','carpenter'),('jack','driver'),('Leslie','carpenter')]
query = Q()
for name, job in NK_list:
query |= Q(name=name, job=job)
chosen_persons = Person.objects.filter(query)
我没有我想要的对象的 ID,因为它们是由 bulk_create
创建的:并且 bulk_create
没有 return 具有 ID 的对象,所以我需要获取他们通过他们的自然键。
是否可以通过自然键过滤来获取对象?我在文档中没有找到任何内容。
我们已经可以做到:
id_list = [10,3,5,34]
MyModel.objects.filter(id__in=id_list)
我想要与自然键相同的东西:
NK_list = [('bob','carpenter'),('jack','driver'),('Leslie','carpenter')]
chosen_persons = Person.objects.filter(natural_key__in=NK_list)
我的模型是这样的:
class PersonManager(models.Manager):
def get_by_natural_key(self, name, job):
return self.get(name=name, job=job)
class Person(Models.model):
name = models.CharField(max_length=200)
job = models.CharField( max_length=200)
objects = PersonManager()
class Meta:
unique_together = [['name', 'job']]
def natural_key(self):
return (self.name, self.job)
--编辑--
最终我找到了一个更快的解决方案来取回 bulk_created
创建的对象:按最后创建的对象过滤!我比较了这与通过自然键获取对象之间的时间,它确实更快。
你可以这样做:
NK_list = [('bob','carpenter'),('jack','driver'),('Leslie','carpenter')]
query = Q()
for name, job in NK_list:
query |= Q(name=name, job=job)
chosen_persons = Person.objects.filter(query)