在我的icontains调用中使用get_or_create会得到一个意想不到的结果。
以下列例子为例:
>>>team_name = "Bears"
>>>Team.objects.get(name__icontains=team_name) # returns DoesNotExist as expected
>>>team, created = Team.objects.get_or_create(name__icontains=team_name)
>>>print(created) # Prints True as expected
>>>print(team.name) # Prints an empty string!为什么这会创建一个空白的团队,而不是“熊”?我在这里使用get_or_create的原因是,如果后续的用户发布类似"BearS"的内容,我希望得到正确的团队,而不是创建一个大写不正确的重复团队。
发布于 2017-09-08 17:06:32
我认为这里您应该拆分get()和create()功能,而不是使用get_or_create(),因为__icontains查找只适用于get()。
试着做这样的事情:
>>> team_name = 'Bears'
>>> teams = Team.objects.filter(name__icontains=team_name)
# This will filter the teams with this name
>>> team = teams.first() if teams.exists() else Team.objects.create(name=team_name)
# Now your team is the first element of your previous query (it returns a QuerySet with single element) if it exists
# Otherwise, you create a new Team.发布于 2017-09-08 17:52:04
除了wencakisa的答案之外,另一个选项是在get_or_create中包含get_or_create参数,因为Django剥离了包含__分隔符的查找。见this question的答案。
守则将是:
Team.objects.get_or_create(
name__icontains=team_name,
defaults = {
"name": team_name
}
)发布于 2019-07-04 18:21:38
正确的方法是使用Django的函数get_or_create()。但是,您应该使用“i精确”(),而不是“图标”(),除非您想要精确匹配,在这种情况下,您应该使用“精确”:
Team.objects.get_or_create(
name__iexact=team_name,
defaults = {
"name": team_name
}
)在“默认”之外,你应该把你的搜索词。如果对象不存在,则应在“默认值”中写入创建项。
https://stackoverflow.com/questions/46121243
复制相似问题