gpt4 book ai didi

python - Django - 实例需要有主键值才能使用多对多关系

转载 作者:行者123 更新时间:2023-11-30 23:37:04 25 4
gpt4 key购买 nike

我知道它希望我在访问 M2M 字段之前进行保存。我不想保存模型。我正在使用名为 TaskSearchCriteria 的模型来搜索任务。用户可以选择将条件保存到数据库中以供将来搜索。但应该可以在不保存条件的情况下进行一次性搜索。这是我的模型。

class TaskSearchCriteria(models.Model):
name = models.CharField(max_length=256)
task_name = models.CharField(max_length=256, blank=True, null=True)
project = models.ForeignKey(Project, blank=True, null=True)
sprint = models.ForeignKey(Sprint, blank=True, null=True)
type = models.ForeignKey(TaskType, blank=True, null=True)
priority = models.ForeignKey(Priority, blank=True, null=True)
status = models.ForeignKey(Status, blank=True, null=True)
description = models.CharField(max_length=1024, blank=True, null=True)
owner = models.ForeignKey(User)
users = models.ManyToManyField(User, related_name='a+')

def get_param_dict(self):
retval = dict()
if self.task_name != None and len(self.task_name) > 0:
retval["name__contains"] = self.task_name
if self.project != None:
retval["project__id"] = self.project.pk
if self.sprint != None:
retval["sprint__id"] = self.sprint.pk
if self.type != None:
retval["type__id"] = self.type.pk
if self.priority != None:
retval["priority__id"] = self.priority.pk
if self.status != None:
retval["status__id"] = self.status.pk
if self.description != None and len(self.description) > 0:
retval["description__contains"] = self.description
if self.users != None and len(self.users) > 0: #**ERROR HERE**
ids = [user.pk for user in self.users]
retval["users__in"] = ids
return retval

我使用模型表单来创建模型并运行 get_param_dict() 方法来创建用于 model.object.filter() 的字典。是否可以使用m2m字段而不保存到数据库?

最佳答案

简而言之,不,不保存模型就无法使用 m2m 字段。

这就是原因。您必须记住 m2m 领域如何运作。与外键不同,M2M 关系需要一个中间表,该中间表具有两个指向另外两个表的外键,因此允许任一表(在外键中)有许多行,从而允许多对多行为。因此,为了检索模型中的 users,您必须在数据库中查询 users 中间 m2m 表,其中 TaskSearchCriteria 的外键为模型实例的主键。只有这样您才能获取与您的模型关联的用户列表。但如果您的模型未保存,则这是不可能的,因为您还无法查询中间表。

但是,您可以通过手动向 get_param_dict 方法提供用户列表来提供模型实例未保存时的解决方法:

def get_param_dict(self, users=[]):
retval = dict()

# ...

# retreive users from the m2m relation
if self.pk:
ids = [user_id[0] for user_id in self.users.all().values_list('pk')]
if ids:
retval["users__in"] = ids

# when model is not saved - get user ids from the parameter
else:
if users:
retval["users__in"] = users

return retval

关于python - Django - 实例需要有主键值才能使用多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15913659/

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