【发布时间】: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