使用变量名调用Django模型的filter

0 投票
2 回答
888 浏览
提问于 2025-04-17 14:33

可能是重复的问题:
django:用字符串选择特定模型

举个例子:(Django,views.py)

def create(request, mod):  
    #mod is a modelname    
    if request.method == 'POST':  
        form = globals()[mod+"Form"](request.POST)  
        if form.is_valid():  
            new_file_num = form.save(commit=False)  
            >>>> if entry.objects.filter(fileTypeNumber=1).exists():  

我的问题在这里。

if entry.objects.filter( ....

相反,我想要:

mod = entry;  
if mod.objects.filter( ....  

这里的总体目标是使用相同的“视图”来处理多个模型,这些模型有不同的字段。 有没有更好的方法来做到这一点?这个视图基本上是分配一个文件编号,然后保存它。

提前谢谢你

2 个回答

0

从实例中获取类。

mod = my_instance.__class__
if mod.objects.filter(fileTypeNumber=1).exists():
0

你可以尝试这样做:

from models import Foo, Bar

def create_view(model):
    # model is the actual model class (not instance)
    def view(request):
        form = globals()[model.__name__ + "Form"]
        if model.objects.filter(fileTypeNumber=1).exists():
            pass
            # whatever you do with it
    return view

foo_view = create_view(Foo)
bar_view = create_view(Bar)

这样会为FooBar这两个模型创建两个视图。不过,如果这两个模型的字段不一样(或者你需要验证、处理其他事情等),那么手动为每个模型单独创建视图可能会更好,而不是使用这种抽象的创建方法。

撰写回答