【问题标题】:Django / views- add field to model and return to templateDjango/views-向模型添加字段并返回模板
【发布时间】:2016-04-14 20:45:35
【问题描述】:

我有三个模型:Address、Address_localisation(其中 address_id 是 ForeignKey)和 Address_users(其中 address_id 又是 ForeignKey)。

在第一步中,我想通过本地化获取所有地址。 我尝试使用:

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)

但这会导致我出错: “无法将关键字'经度'解析为字段。选择是:id..(地址模型中列出的文件)”

据我了解,这是因为在主模型中我没有经度/纬度字段......但是我应该如何添加它们?

我知道我可以遍历模板中的 address_localisation_set(我没有尝试过,但在 stackoverflow 上找到了解决方案),但是在我的源代码的另一个地方添加字段可能很有用,所以我想知道怎么做.

提前感谢您的宝贵时间

【问题讨论】:

    标签: python django views models foreign-key-relationship


    【解决方案1】:

    你真的不能在模型中添加字段;但是您可以将任何属性添加到模型实例,因为这就是 Python 的工作方式 - 可以“动态”为对象分配属性;但这并不是您在场景中真正需要的。

    您需要构建一个自定义数据集并将其发送到您的模板,这在您的视图中很容易完成:

    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)
    

    【讨论】:

    • 谢谢!这解决了我的问题,比我想象的要简单:)
    猜你喜欢
    • 2012-06-05
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多