小编gma*_*map的帖子

带有芹菜的 Django - 找不到现有对象

我在从另一个 celery 任务执行 celery 任务时遇到问题。

这是有问题的片段(数据对象已经存在于数据库中,它的属性只是在 finalize_data 函数中更新):

def finalize_data(data):
    data = update_statistics(data)
    data.save()
    from apps.datas.tasks import optimize_data
    optimize_data.delay(data.pk)

@shared_task
def optimize_data(data_pk):
    data = Data.objects.get(pk=data_pk)
    #Do something with data
Run Code Online (Sandbox Code Playgroud)

调用 optimize_data 函数失败,并显示“数据匹配查询不存在”。

如果我在 finalize_data 函数中调用 pk 函数检索它工作正常。如果我将 celery 任务调用延迟一段时间,它也可以正常工作。

这一行:

optimize_data.apply_async((data.pk,), countdown=10)
Run Code Online (Sandbox Code Playgroud)

代替

optimize_data.delay(data.pk)
Run Code Online (Sandbox Code Playgroud)

工作正常。但我不想在我的代码中使用 hacks。.save() 调用是否有可能异步阻止对该行/对象的访问?

python django asynchronous celery

5
推荐指数
2
解决办法
1886
查看次数

Django Rest Framework动态字段序列化

我在序列化方面遇到问题。我有一个对象的查询集,例如:

uvs = UserVehicles.objects.all()
Run Code Online (Sandbox Code Playgroud)

这些对象中有一些已过期,有些则没有。我想在序列化程序中有不同的字段,具体取决于到期信息。例如,我想从过期对象中排除status和distance_travelled字段。最简单的方法是什么?我尝试下一个代码,但是init方法中的self.object包含一个数组,因此它将删除所有对象的字段,而不仅仅是过期的对象。

serialized_data = UserVehicleSerializer(uvs, many=True).data

class UserVehicleSerializer(serializers.ModelSerializer):

    class Meta:
        model = UserVehicle
        fields = ('type', 'model', 'status', 'distance_travelled',)

    def __init__(self, *args, **kwargs):
        super(UserVehicleSerializer, self).__init__(*args, **kwargs)

        if self.object.is_expired:
            restricted = set(('distance_travelled', 'status',))
            for field_name in restricted:
                self.fields.pop(field_name)
Run Code Online (Sandbox Code Playgroud)

django serialization django-rest-framework

5
推荐指数
1
解决办法
1565
查看次数

django 查询中收到“missing FROM-clause”编程错误

我正在尝试编写一个查询,该查询检索应通知其所有者到期的所有订阅。

我想排除已通知的订阅和具有较新订阅可用的订阅。

接下来是查询:

Subscription.objects.filter(
    end_date__gte=timezone.now(),
    end_date__lte=timezone.now() + timedelta(days=14),
).exclude(
    Q(notifications__type=Notification.AUTORENEWAL_IN_14) | Q(device__subscriptions__start_date__gt=F('start_date'))
)
Run Code Online (Sandbox Code Playgroud)

如果没有该| Q(device__subscriptions__start_date__gt=F('start_date')部分,查询将完美运行。有了它,django (postgres) 会引发下一个错误:

django.db.utils.ProgrammingError: missing FROM-clause entry for table "u1"
LINE 1: ...ption" U0 INNER JOIN "orders_subscription" U2 ON (U1."id" = ...
Run Code Online (Sandbox Code Playgroud)

我检查了sql,似乎不正确:

SELECT "orders_subscription"."id",
       "orders_subscription"."months",
       "orders_subscription"."end_date",
       "orders_subscription"."start_date",
       "orders_subscription"."order_id",
       "orders_subscription"."device_id",
FROM "orders_subscription"
WHERE ("orders_subscription"."churned" = false
       AND "orders_subscription"."end_date" >= '2019-04-05T13:27:39.808393+00:00'::timestamptz
       AND "orders_subscription"."end_date" <= '2019-04-19T13:27:39.808412+00:00'::timestamptz
       AND NOT (("orders_subscription"."id" IN
                   (SELECT U1."subscription_id"
                    FROM "notifications_notification" U1
                    WHERE (U1."type" = 'AUTORENEWAL_IN_2W'
                           AND U1."subscription_id" IS NOT NULL))
                 OR ("orders_subscription"."device_id" …
Run Code Online (Sandbox Code Playgroud)

python django postgresql orm

5
推荐指数
1
解决办法
2278
查看次数