通过知道其名称来使模型动态化

时间:2018-09-05 17:44:57

标签: django django-models

我使用Django 2.1。

我有一个通用实用工具/功能(使用芹菜),可以从Model(是抽象模型,由其他Model继承)的save方法调用。

由于该函数中的数据将被序列化,因此将模型名称和PK传递给它。

class A(models.Model)

   def save(self, *args, **kwargs):

     send_async(model_name=type(self).__name__, pk=self.id))




class B(A)
class C(A)

稍后,我想查询模型,但是我不知道如何获取模型:

我尝试过:

 model = apps.get_model('django_app_name.{}'.format(model_name)) 

我收到以下错误:

No installed app with label 'django_app_name'.

也:

 model = ContentType.objects.get(model=model_name)

这不会引发错误,但是非常奇怪的行为会使用不同的参数“调用”视图,并且当然不会有结果。

3 个答案:

答案 0 :(得分:0)

使用具有模型的应用名称,而不要使用django_app_name

答案 1 :(得分:0)

要获取型号名称,请尝试以下操作:

send_async(model_name=self.__class__.__name__, pk=self.id)

instance.__class__.__name__将返回类名称

答案 2 :(得分:0)

您应该这样做:

class A(models.Model)

   def save(self, *args, **kwargs):
       send_async(
            model_name=self._meta.model_name,
            app_label=self._meta.app_label,
            pk=self.id
       )

在send_async中:

def send_async(model_name, app_label, pk):
    content_type = ContentType.objects.get(app_label=app_label, model=model_name)
    instance = content_type.get_object_for_this_type(id=pk)
    ...

有关它的更多信息,请参见https://docs.djangoproject.com/en/2.1/ref/contrib/contenttypes/