社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

在django中测试时的模型创建顺序?

Hanny • 5 年前 • 604 次点击  

我有这两个模型(示例),当我试图运行测试时,它会错误地说: no such table: my_app_modelA -如果我向上滚动,我可以看到它在创建 modelB (我认为是由于 default 正在应用)。有办法订这些吗 modelA 总是会在 小精灵 ?或者我不应该将该方法引用为默认属性?只是想让我的测试工作,这是我的症结所在。

我的模特看起来是这样的:

class modelA(models.Model):
    attribute = models.IntegerField()
    active = models.BooleanField(default=False)

    @classmethod
    def get_active_attribute(cls):
        return modelA.objects.get(active=True).attribute

class modelB(models.Model):
    attribute = models.IntegerField(default=modelA.get_active_attribute())

我的问题是:

  • 这是一个可以接受的事情-让默认调用另一个模型方法?

  • 有没有办法处理这些模型的创建,我可以保证 模特儿 先创建,所以 模型B 能否在我的测试中成功创建?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/46007
 
604 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Aman Garg
Reply   •   1 楼
Aman Garg    6 年前

首先,迁移按创建迁移文件时定义的顺序进行。

# 0001_initial.py
...
operations = [
    migrations.CreateModel(
        name=modelA,
        ....
    ),
    migrations.CreateModel(
        name=modelB,
        ....
    ),
]

您可以检查迁移文件并确保 modelA 是以前 modelB .

其次, modelA.get_active_attribute() 需要一个数据库条目才能返回某些内容。运行迁移时,不插入数据。所以你不应该宣布 default 其他模型的对象。 你应该重写 save() 确保默认值基于 模特儿 的属性。

class modelB(models.Model):
    attribute = models.IntegerField()

    def save(self, *args, **kwargs):
        if self.attribute is None:
            self.attribute = modelA.get_active_attribute()
        super(modelB, self).save(*args, **kwargs)