微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用工厂男孩时,Django 模型对象没有属性“_default_manager”

如何解决使用工厂男孩时,Django 模型对象没有属性“_default_manager”

我正在使用 Django Rest Framework 创建一些 api。我正在使用工厂男孩来创建测试实例。我有一个名为 base_model 的抽象模型,它被项目的所有其他模型继承。

    created_at = models.DateTimeField(editable=False)
    updated_at = models.DateTimeField(editable=False)

    class Meta:
        abstract = True
        ordering = ['id']

    def save(self,*args,**kwargs):
        if not self.created_at:
            self.created_at = timezone.Now()
        self.updated_at = timezone.Now()
        super(BaseModel,self).save(*args,**kwargs)

我的客户模型

 from django.db import models

from mtl_manager.api.base_model import BaseModel
from mtl_manager.projects.enums import ProjectStatus
 
class Client(BaseModel):
    client_name = models.CharField(max_length=250,blank=False)
    phone_number = models.CharField(max_length=250,blank=False)
    email = models.EmailField(blank=False,unique=True,null=False)
    addressLane1 = models.TextField()

这个模型奏效了。我能够创建检索和列出客户端对象。现在我要对路由进行单元测试,并开始使用 Factory boy 创建实例

class ClientFactory(DjangoModelFactory):
    name = Faker("company")
    gst = "323232";
    phone_number = Faker("phone_number")
    zipCode = "686542"
    address_lane = Faker("street_address")
    registration_number = "32313094839483"
    state = "kerala"
    country = Faker("country")

    class Meta:
        model = Client()

这会引发错误 Attribute-error: 'Client' object has no attribute '_default_manager'。

但是从我的控制台我验证了客户端是否使用了认管理器

In [11]: Client.objects
Out[11]: <django.db.models.manager.Manager at 0x7fe4fc6d7bb0>

解决方法

您需要传递对 Client class 的引用,而不是构造 Client 对象,因此应删除 model = Client() 中的括号:>

class ClientFactory(DjangoModelFactory):
    # …

    class Meta:
        model = Client

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。