【问题标题】:How not to use redundant fors when it comes to querying multiple tables查询多表时如何不使用冗余fors
【发布时间】:2011-11-03 13:40:09
【问题描述】:

所以我有这种网址:

url(r'^(?P<loc>\w+)/(?P<ctg>\w+)/$', 'beta.views.queryCtgFromIndex'),

可以看出,当访问例如 /loc/ctgx/ 时,会调用 queryCtgFromIndex 并根据 ctgx 表计算一些东西

我实际上有5个可以查询的表,所以有效的url可以是:

/loc/ctg1/, /loc/ctg2/, ..., /loc/ctg5/

在我看来,我正在做类似的事情:

if ctg == ctg1: do something, ctg1.objects.all() etc...
if ctg == ctg2: do something, ctg2.objects.all() etc...
...
if ctg == ctg5: do something, ctg5.objects.all() etc...

do something 代码很大,我的问题是:我可以以某种方式重写我的代码以摆脱五个 fors 并获得干净的代码吗? ...类似于 bash 的内容是虚构的示例:$ctg.objects.all() ...

【问题讨论】:

    标签: django for-loop views models


    【解决方案1】:

    contenttypes 框架允许您以通用方式与模型交互,类似于

    my_model = contenttypes.objects.get(model='my model name')
    my_model.model_class().objects.filter(...whatever you would normally do)
    

    您可能希望使用白名单来确保只有用户不能与之交互,例如你的用户模型以这种方式,例如

    if model_name not in ['list', 'of', 'allowed', 'models']:
        return HttpResponseForbidden()  #or 404
    

    【讨论】:

    • 太棒了!谢谢,你为我省去了很多麻烦和代码行:) 我做到了 - if 'model_name' in str(my_model.model_class()): do sumthin else: 403/404
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多