我在从另一个 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() 调用是否有可能异步阻止对该行/对象的访问?
我在序列化方面遇到问题。我有一个对象的查询集,例如:
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) 我正在尝试编写一个查询,该查询检索应通知其所有者到期的所有订阅。
我想排除已通知的订阅和具有较新订阅可用的订阅。
接下来是查询:
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)