Python 如何创建包含不同类型的queryset表达式

Python 如何创建包含不同类型的queryset表达式,python,django,postgresql,django-models,Python,Django,Postgresql,Django Models,我有两种型号,如: class Category(models.Model): title = models.CharField(max_length=100) expires_in_days = models.PositiveIntegerField(default=20) class Item(models.Model): created = models.DateTimeField(auto_now_add=True) title = models.Ch

我有两种型号,如:

class Category(models.Model):
    title = models.CharField(max_length=100)
    expires_in_days = models.PositiveIntegerField(default=20)


class Item(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100)
    description = models.TextField()
    category = models.ForeignKey(Category)
我需要确定哪些项目应该设置为过期:

items_to_cancel = Item.objects.annotate(expires_date=F('created') + F('category__expires_in_days'))\
                             .filter(expires_date__lte=timezone.now().date())
运行此查询会引发异常:

FieldError: Expression contains mixed types. You must set output_field.
ProgrammingError: operator does not exist: timestamp with time zone + integer.
更新

在我将查询更新为

items_to_cancel = Item.objects.annotate(expires_date=ExpressionWrapper(F('created') + F('category__expires_in_days'), output_field=DateField()))\
                             .filter(expires_date__lte=timezone.now().date())
我得到了一个例外:

FieldError: Expression contains mixed types. You must set output_field.
ProgrammingError: operator does not exist: timestamp with time zone + integer.

所以现在我不知道如何从时间戳中获取日期。

感谢Daniel Roseman对ExpressionWrapper的评论。但我必须再进行一次更新才能使其正常工作,我必须对时间戳应用
TruncDate
函数:

from django.db.models.functions import TruncDate

items_to_cancel = Item.objects.annotate(
        expires_date=ExpressionWrapper(
            TruncDate('created') + F('category__expires_in_days'),
            output_field=DateField()
        )
    ).filter(expires_date__lte=timezone.now().date())

我希望代码在编辑后更具可读性。就我个人而言,我不使用反斜杠作为行尾。如果不符合您的口味,您可以恢复更改。