【问题标题】:Celery Task class with DRF serializer带有 DRF 序列化程序的 Celery 任务类
【发布时间】:2017-08-19 21:04:45
【问题描述】:

我尝试在具有多重继承的同一类中使用 Celery Task 和 Django rest 框架序列化程序。

from celery import Task
class ReceiveSerializer(Task, serializers.Serializer):
    def run(self, source, *args, **kwargs):
        self.save()
    def save(self, **kwargs):
        # call long running save method

我有错误,

  File "<>\serializers.py", line 217, in <module>
    class ReceiveSerializer(Task, serializers.Serializer):
  File "<>\workspace\www\lib\site-packages\celery-3.1.20-py2.7.egg\celery\app\task.py", line 199, in __new_
_
    tasks.register(new(cls, name, bases, attrs))
TypeError: Error when calling the metaclass bases
    metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

save 方法必须在 db 中创建一长串对象(有时超过 5 分钟)。我不希望用户等待很长时间。 有没有办法做到这一点。

【问题讨论】:

    标签: django django-rest-framework celery


    【解决方案1】:

    可以使用 Mixin 吗?

    class YourMixin:
        # if you want to trigger the task on save:
        def save(self, *args, **kwargs):
            ret = super().save(*args, **kwargs)
            some_task.apply_async((
                self.__class__.__name__,
                self.pk,
            ))
            return ret
    
    
    @task()
    def some_task(model_name, model_id):
        my_model = apps.get_model('django_app_name.{}'.format(model_name))
        obj = my_model.objects.get(pk=model_id)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多