比较Django中抽象模型的Django子类

时间:2019-12-20 11:01:47

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

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

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类。

2 个答案:

答案 0 :(得分:0)

更准确地说, 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...

答案 1 :(得分:0)

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

类似的事情应该起作用:

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