【问题标题】:How to check if a model is an intermediate model如何检查模型是否为中间模型
【发布时间】:2023-01-09 02:58:03
【问题描述】:

the docs 中的示例为例,我正在尝试检查模型是否为中间模型。

from django.db import models


class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):
        return self.name


class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

    def __str__(self):
        return self.name


class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

所以像这样的函数,它将模型作为输入,如果模型是中间模型则返回 true,否则返回 false。

def is_intermediate(model):
    pass

# is_intermediate(Person) -> False
# is_intermediate(Group) -> False
# is_intermediate(Membership) -> True

我相信 Django REST Framework 有一种方法可以使用 has_through_model 属性来做到这一点。看着那个,我写了这个:

def is_intermediate(model):
    for field in model._meta.get_fields():
        if field.is_relation:
            for related_field in field.related_model._meta.get_fields():
                through = getattr(related_field.remote_field, "through", None)
                if through and not through._meta.auto_created and through == model._meta.model:
                    return True
    return False

它有效。但对我来说,这听起来完全没有效率。是否有更高效的方法来查找模型是否处于中间状态?

【问题讨论】:

  • 您拥有的那个实现可能看起来很多,但根据模型的大小和模型的数量,循环迭代的次数可能不会那么大。但这取决于您使用 is_intermediate 函数的时间和频率。如果您需要它非常快,那么向模型的元类添加一个布尔变量可能是值得的(不是动态的并且必须维护但非常高效)。否则你的实现可能没问题。

标签: python django django-models


【解决方案1】:

这是我的方法:

检查模型是否具有名为“intermediate_model”的属性。许多模型(例如`keras库中的模型)都有这个属性,它是一个布尔值,表示模型是否是中间模型。

if hasattr(model, 'intermediate_model') and model.intermediate_model:
    # model is an intermediate model

如果模型没有“intermediate_model”属性,您可以检查它是否是中间模型类的子类。例如,在keras库中,中间模型是Model类的子类,可以通过检查模型是否是Model的实例来识别:

from tensorflow.keras.models import Model

if isinstance(model, Model):
    # model is an intermediate model

您还可以检查模型是否具有仅存在于中间模型中的特定属性或方法。例如,在keras库中,中间模型有一个trainable属性,表示模型的权重是否可以训练。您可以检查此属性以确定模型是否为中间模型:

if hasattr(model, 'trainable') and model.trainable:
    # model is an intermediate model

【讨论】:

    猜你喜欢
    • 2017-12-12
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多