Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django创建两个对象,如果Don';不存在_Python_Django_Django Models_Django Views - Fatal编程技术网

Python Django创建两个对象,如果Don';不存在

Python Django创建两个对象,如果Don';不存在,python,django,django-models,django-views,Python,Django,Django Models,Django Views,我有一个django应用程序,我需要在一个视图函数中获取两个对象:token和plan,如果它们不存在,则创建它们,这里是我当前使用的代码: def get_or_create_token_and_plan(user): try: token = Token.objects.get(user=user) except ObjectDoesNotExist as e: token = Token.objects.create(user=user) try: pl

我有一个django应用程序,我需要在一个视图函数中获取两个对象:
token
plan
,如果它们不存在,则创建它们,这里是我当前使用的代码:

def get_or_create_token_and_plan(user):
  try:
    token = Token.objects.get(user=user)
  except ObjectDoesNotExist as e:
    token = Token.objects.create(user=user)
  try:
    plan = Plan.objects.get(user=user)    
  except ObjectDoesNotExist as e:
    plan = Plan.objects.create(user=user)
  return token, plan

def profile(request):
  user = User.objects.get(username=request.user)
  token, plan = get_or_create_token_and_plan(user)
  context = {'token':token, 'plan':plan} 
  return render(request, 'profile.html', context)
我正试图找出一种改进
get\u或\u create\u token\u和
函数的方法,因为我知道
token
plan
对象在理论上最初是同时创建的。除了异常,如果我将两个
try都合并到一个
结构中,就会工作,如下所示:

def get_or_create_token_and_plan(user):
  try:
    token = Token.objects.get(user=user)
    plan = Plan.objects.create(user=user)   
  except ObjectDoesNotExist as e:
    token = Token.objects.create(user=user)
    plan = Plan.objects.get(user=user)        
  return token, plan
这方面的主要问题是,如果
token
已经存在,而
plan
没有,那么在为同一用户再次创建时,我将得到一个IntegrityError,但正如所说的,理论上这不会发生,因为
token
plan
都将仅在该函数中创建,所以我的问题是,在这种情况下,我应该更改
get\u或\u create\u token\u和\u plan
,还是应该使用我后面提到的示例。

Django提供了一个可能对您有用的函数。所以我想你能做到

def get_or_create_token_and_plan(user):
  token, _ = Token.objects.get_or_create(user=user)
  plan, _ = Plan.objects.get_or_create(user=user)
  return token, plan

您的初始函数没有问题,但您可以使用我一直在寻找的函数!顺便说一句,
get\u或\u create
返回一个元组,对吗?。就像是
token,boolean=token.objects.get\u或\u create(user=user)
只获取对象一样。你说得对,对不起。我会更新答案。