get()返回了多个Phone——它返回了4个



我正在django中开发一个小api。我有两个模型/桌子第一个用户,第二个电话

_____________
**models.py**
_____________
class Users(models.Model):
userId = models.AutoField(primary_key=True,default=None)
name = models.CharField(max_length=10)
status = models.CharField(max_length=10 , default='BLOCKED')
address = models.TextField(null=False,default=None)
class Meta:
db_table = 'users'
class Phones(models.Model):
phoneId = models.AutoField(primary_key=True,default=None)
userId = models.IntegerField(null=False)
numbers = models.CharField(max_length = 15, null=True)
phonesCountryCode = models.CharField(max_length=5,null=True)
class Meta:
db_table = 'phones'

我已经编写了从json对象获取数据的代码。json对象看起来像这个

______________
**json input**
______________
{
"name": "abc",
"status": "ACTIVE",
"address": "xyz",
"phones": [
{
"numbers": {
"numbers": "23378",
"phonesCountryCode": "+91"
}
},
{
"numbers": {
"numbers": "12390",
"phonesCountryCode": "+91"
}
},
{
"numbers": {
"numbers": "7890",
"phonesCountryCode": "+91"
}
},
{
"numbers": {
"numbers": "45221",
"phonesCountryCode": "+91"
}
}
]
}

将数据插入数据库很好。但当我想更新数据时,它会给我错误我在数据库中有多个数据,这就是为什么如果使用get((会得到多个数据错误,如果使用filter((会给出没有属性_meta的错误。我找不到任何答案,如有帮助将不胜感激。

____________
**views.py**
____________
@api_view(['PUT'])
def ListUpdate(request,pk):
data = request.data
name =data['name']
status=data['status']
address=data['address']
user= Users.objects.get(userId=pk)
print(location)
user_serializer = UserSerializer(data={"name": name,"status": status, "address": address},instance=user)
usrid= Users.objects.latest('userId').userId
Useriiid= usrid
if location_serializer.is_valid(raise_exception=True):
location_serializer.save()




for person in data['phones']:
numbers=person['number']['number']
phonesCountryCode=person['number']['countryCode']
phn = Phones.objects.get(userId= pk)
phone_serializer = PhoneSerializer(instance=phn,data={"userId":Useriiid,"numbers":numbers,"phonesCountryCode":phonesCountryCode})
if phone_serializer.is_valid(raise_exception=True):
phone_serializer.save()
return Response({'status': 'Success'})

我试过如果电话表只有一个数据,它就能工作的代码即具有唯一的id userId。

在你的代码中,除了其他不地道的地方之外,我认为你想要一些类似的东西。

def ListUpdate(request, pk):
data = request.data.copy()  # Grab a shallow copy of the data, so...
phones = data.pop("phones")  # ... we can remove the phones...
user = Users.objects.get(userId=pk)
with transaction.atomic():  # do all changes or none of them
# ... and use the rest of the data as-is here in `data`
user_serializer = UserSerializer(data=data, instance=user) 
user_serializer.save()  # update user info
Phones.objects.filter(userId=user.pk).delete()  # wipe out all phones for the user
for phone in phones:  # loop over the phones data, validate & save
phone_serializer = PhoneSerializer(data=phone)
if phone_serializer.is_valid(raise_exception=True):
phone_serializer.save(userId=user.pk)
return Response({"status": "Success"})

不过,正如前面所说,您确实应该研究Django中的外键是如何工作的,而不是依赖于整数字段。

最新更新