如何使用get_or_create?错误:get()返回了多个Patient--它返回了7



我有一个获取API的函数,在这里我为JSON中的每个对象创建一个Django模型对象,并将数据存储在Django模型中。这里的问题是,每次我调用路由时,它都会一次又一次地创建记录,因为我使用了create方法,但我研究过,停止这种情况的最佳方法是使用get_or_create。所以,我尝试了这个方法,但看起来我错过了什么,因为我得到了一个错误:feedback.models.Patient.MultipleObjectsReturn:get((返回了多个Patient——它返回了7

这是我的代码,在我有2个for循环之前,这样我就可以循环遍历每个病人,然后遍历每个角色,并用一个角色保存病人:

# FetchApi for Patients def fetchapi_patients(request):
url = 'http://localhost:8000/core/users/roles/patient'
headers={"Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Imhha2FuQGdvLmNvbSIsImV4cCI6MTYxMDAxMTM0MSwib3JpZ19pYXQiOjE2MTAwMDc3NDF9.k2204d094DNUbEfFt8M_7chukOSjWWwfesPOH5jIiP8"}
response = requests.get(url, headers=headers)
#Read the JSON
patients = response.json()
#Create a Django model object for each object in the JSON and store the data in django model (in database)
for patient in patients:
Patient.objects.create(first_name=patient['first_name'], last_name=patient['last_name'], email=patient['email'], coreapi_id=patient['ID'])
for role in patient['Roles']:
Role.objects.create(role_name=role['name'])
return JsonResponse({'patients': patients})

这是我尝试使用get_or_create方法的时候:

for patient in patients:
patientDatabase, created = Patient.objects.get_or_create(first_name=patient['first_name'], last_name=patient['last_name'], email=patient['email'], coreapi_id=patient['ID'])
for role in patient['Roles']:
Role.objects.get_or_create(role_name=role['name'])

return JsonResponse({'patients': patients})

这是我的型号。py:

class Patient(models.Model):
coreapi_id = models.CharField(max_length=100)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
email = models.EmailField(max_length=100)
language = models.CharField(max_length=20)
created_date = models.DateTimeField(auto_now_add=True)
def str(self):
return self.email
class Role(models.Model):
role_id = models.ManyToManyField(Patient)
role_name = models.CharField(max_length=100)
def __str__(self):
return self.role_name

追溯错误:

Traceback (most recent call last):   File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)   File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)   File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)   File "/home/stela/feedbacksystem/feedback/views.py", line 88, in fetchapi_patients
patientDatabase, created = Patient.objects.get_or_create(first_name=patient['first_name'], last_name=patient['last_name'], email=patient['email'], coreapi_id=patient['ID'])   File "/usr/lib/python3/dist-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)   File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 538, in get_or_create
return self.get(**kwargs), False   File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 410, in get
raise self.model.MultipleObjectsReturned( feedback.models.Patient.MultipleObjectsReturned: get() returned more than one Patient -- it returned 7!

我阅读了官方文档,但对get_or_create方法有一些误解,我不太清楚。例如,我想只通过用户的电子邮件来检查他们,因为我读到它应该是";"独特";,所以get_or_create会检查我的模型中的每个字段,或者。。?我希望我的问题是清楚的,如果不是,请让我知道

有多个对象具有相同的属性(first_namelast_nameemailcoreapi_id(,而get_or_create拒绝执行任何操作,因为这可能是一个逻辑问题。

只有.get()也会发生同样的情况(.get_or_create()确实是这样做的(。

如果您的意思是,例如,只使用coreapi_id字段获取患者,但如果不存在具有该数据的患者,则使用其他字段创建它们,则需要使用defaults参数:

patientDatabase, created = Patient.objects.get_or_create(
coreapi_id=patient["ID"],
defaults=dict(
first_name=patient["first_name"],
last_name=patient["last_name"],
email=patient["email"],
),
)

get_ot_create方法必须仅在某些内容唯一时使用。

在您的情况下,有多个对象不是唯一的,所以它返回多个对象,但应该只返回一个对象

最新更新