Django / views- 添加字段到模型和 return 到模板
Django / views- add field to model and return to template
我有三个模型:地址、Address_localisation(其中 address_id 是外键)和 Address_users(其中 address_id 又是外键)。
第一步,我想获取所有地址及其本地化信息。
我尝试使用:
data = address.objects.select_related().all().annotate(
longitude=F('address_localisation__longitude'),
latitude=F('address_localisation__latitude')
)
但是如果在 address_users 中我有两个(或更多)用户的一个地址,这会给我两个(或更多)具有相同地址的行(因为加入模型)。
所以我只想获取地址和连接的本地化。
我尝试过的:
data = address.objects.prefetch_related('address_localisation_set').all()
for e in data.all():
for ee in e.address_localisation_set.all():
e.longitude = ee.longitude
e.latitude = ee.latitude
data = list(data.values('id',
'longitude',
'latitude'
))
data = json.dumps(data)
data = json.loads(data)
return JsonResponse(data, safe = False)
但这导致我出错:
"Cannot resolve keyword 'longitude' into field. Choices are: id.. (listed fileds from Address model)"
据我了解,这是因为在主模型中我没有 longitude/latitude 字段...但是我应该如何添加它们?
我知道我可以在模板中遍历 address_localisation_set(我没试过,但在 Whosebug 上找到了解决方案),但是在我的源代码的另一个地方添加字段可能很有用,所以我想知道怎么做。
提前感谢您的宝贵时间
你真的不能给模型添加字段;但是您可以将任何属性添加到模型实例,因为这就是 Python 的工作方式 - 可以为对象分配属性 "on the fly";但这并不是您在场景中真正需要的。
您需要构建自定义数据集并将其发送到您的模板,这在您看来很容易完成:
results = [] # This is what you will send to the template
for location in address.objects.select_related():
data = {} # an empty dictionary
localized_data = location.address_localisation_set.first()
data['lat'] = localized_data.latitude
data['lon'] = localized_data.longitude
data['id'] = location.id
results.append(data)
return JsonResponse(json.dumps(results), safe=False)
我有三个模型:地址、Address_localisation(其中 address_id 是外键)和 Address_users(其中 address_id 又是外键)。
第一步,我想获取所有地址及其本地化信息。 我尝试使用:
data = address.objects.select_related().all().annotate(
longitude=F('address_localisation__longitude'),
latitude=F('address_localisation__latitude')
)
但是如果在 address_users 中我有两个(或更多)用户的一个地址,这会给我两个(或更多)具有相同地址的行(因为加入模型)。
所以我只想获取地址和连接的本地化。 我尝试过的:
data = address.objects.prefetch_related('address_localisation_set').all()
for e in data.all():
for ee in e.address_localisation_set.all():
e.longitude = ee.longitude
e.latitude = ee.latitude
data = list(data.values('id',
'longitude',
'latitude'
))
data = json.dumps(data)
data = json.loads(data)
return JsonResponse(data, safe = False)
但这导致我出错: "Cannot resolve keyword 'longitude' into field. Choices are: id.. (listed fileds from Address model)"
据我了解,这是因为在主模型中我没有 longitude/latitude 字段...但是我应该如何添加它们?
我知道我可以在模板中遍历 address_localisation_set(我没试过,但在 Whosebug 上找到了解决方案),但是在我的源代码的另一个地方添加字段可能很有用,所以我想知道怎么做。
提前感谢您的宝贵时间
你真的不能给模型添加字段;但是您可以将任何属性添加到模型实例,因为这就是 Python 的工作方式 - 可以为对象分配属性 "on the fly";但这并不是您在场景中真正需要的。
您需要构建自定义数据集并将其发送到您的模板,这在您看来很容易完成:
results = [] # This is what you will send to the template
for location in address.objects.select_related():
data = {} # an empty dictionary
localized_data = location.address_localisation_set.first()
data['lat'] = localized_data.latitude
data['lon'] = localized_data.longitude
data['id'] = location.id
results.append(data)
return JsonResponse(json.dumps(results), safe=False)