首页 > 解决方案 > 我无法使用自定义模型管理器访问模型的属性

问题描述

我正在为客户模型编写自定义模型管理器,这是我的模型

class CustomerMenager(models.Manager):
    def getCutomerCountry(self):
        return self.filter(country__exact='India')


class Customer(models.Model):
    firstName = models.CharField(max_length=40)
    lastName = models.CharField(max_length=40)
    city = models.CharField(max_length=40)
    country = models.CharField(max_length=40)
    phone = models.CharField(max_length=20)

    mymanager = CustomerMenager()

    def __str__(self):
        return self.firstName

我的看法是

def customerView(request):
    custmr = CustomerForm()
    if request.method == 'POST':
        custmr = CustomerForm(request.POST)
        if custmr.is_valid():
              custmr.save()
            

    c = Customer.mymanager.getCutomerCountry()
    print(c)
    return render(request,'customer.html',{'customer':custmr,'cust':c})

当上面的代码执行时,我得到以下对象

 Django version 3.1.2, using settings 'DjangoTuts.settings'
 Starting development server at http://127.0.0.1:8000/ 
 Quit the server with CTRL-BREAK.
 <QuerySet [<Customer: amit>]>

但是当我在像这样的 cust.firstName 模板中访问这个对象时,它给了我错误

'QuerySet' object has no attribute 'firstName'

我不明白为什么会这样。请帮助提前谢谢

标签: pythondjango-models

解决方案


这是因为getCutomerCountry返回的是一个QuerySet对象,而不是一个Customer对象。

要解决此问题,您可以getCutomerCountry返回第一个对象,如下所示:

...
    def getCutomerCountry(self):
        return self.filter(country__exact='India').first()

Customer或在您的视图代码中,从获取第一个QuerySet,如下所示:

def customerView(request):
    ...        
    c = Customer.mymanager.getCutomerCountry().first()
    ...

这将解决您看到的错误。


推荐阅读