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)