【问题标题】:Compare Django child classes of abstract model in Django比较Django中抽象模型的Django子类
【发布时间】:2020-04-12 21:39:18
【问题描述】:

我有两个类作为抽象类的子类(下面的示例)。 如何检查查询集模型是否是这些类之一?

class Parent(models.Model)
    field_a =  models.CharField(primary_key = True, max_length = 24)
    field_b =  models.CharField(primary_key = True, max_length = 24)

    class Meta:
        abstract = True

class A(Parent)
    pass

class B(Parent)
    pass

我已经厌倦了这样的事情,但它不起作用:

if type(queryset.model) == type(A):
    do something...
elif type(queryset.model) == type(B):
    do something else...

因为当我检查类型(queryset.model)时,它返回类型(父), 甚至 queryset.model 也是 A 或 B 类。

【问题讨论】:

标签: django python-3.x django-models django-orm


【解决方案1】:

更准确地说,issubclass 不起作用。 isinstance 方法也不起作用,因为我检查的对象不是实例。

我的问题是,例如,当我有一个子模型的查询集时,当我不知道到底是哪一个时,我该如何检查?

例如:

queryset = A.objects.all()
# or 
queryset = B.objects.all()

如果我不知道查询集(动态方法),这样的检查会在两个条件下返回 false:

if type(queryset.model) == type(A):
    do something...
elif type(queryset.model) == type(B):
    do something else...

因为真实的是:

type(queryset.model) == type(Parent)

我的解决方法是使用__name__,但不知道有没有更好的方法?

if queryset.model.__name__ == A.__name__:
    do something...
elif queryset.model.__name__ == B.__name__:
    do something else...

【讨论】:

    【解决方案2】:

    您应该直接将 queryset.model 与类进行比较。

    这样的事情应该可以工作:

    if queryset.model == A:
        # do your stuff
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 2011-08-05
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      相关资源
      最近更新 更多