Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django queryset过滤器适用于过去和未来的最新版本 上下文_Python_Django - Fatal编程技术网

Python Django queryset过滤器适用于过去和未来的最新版本 上下文

Python Django queryset过滤器适用于过去和未来的最新版本 上下文,python,django,Python,Django,我有如下型号的ContentBuild&ContentBuildDeviceGroupLink: # models.py class ContentBuild(models.Model): content_build_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True) class ContentBuildDeviceGroupLink(models.

我有如下型号的
ContentBuild
&
ContentBuildDeviceGroupLink

# models.py

class ContentBuild(models.Model):
    content_build_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)


class ContentBuildDeviceGroupLink(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
    content_build_uuid = models.ForeignKey(ContentBuild, on_delete=models.CASCADE, related_name='content_build_deploy')
    group_uuid = models.ForeignKey(DeviceGroup, on_delete=models.CASCADE)
    preload_date = UnixDateTimeField()
    release_date = UnixDateTimeField()
in_future = Q(release_date__gte=timezone.now())
recent_past = Q(release_date__lt=timezone.now()).order_by('-release_date')[0]

ContentBuildDeviceGroupLink.objects
.filter(in_future & recent_past)
from django.db.models import Subquery, F

recent_dates = ContentBuildDeviceGroupLink.objects.filter(
    release_date__lte=timezone.now()
).order_by('-release_date').values('release_date')

ContentBuildDeviceGroupLink.objects.annotate(
    start_time=Subquery(recent_dates[:1])
).filter(release_date__gte=F('start_time'))
目标 我想返回过去带有发布日期的最新
ContentBuildDeviceGroupLink
对象,以及将来带有发布日期的所有
ContentBuildDeviceGroupLink
对象

我试过的 我试着像这样使用
Q对象

# models.py

class ContentBuild(models.Model):
    content_build_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)


class ContentBuildDeviceGroupLink(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
    content_build_uuid = models.ForeignKey(ContentBuild, on_delete=models.CASCADE, related_name='content_build_deploy')
    group_uuid = models.ForeignKey(DeviceGroup, on_delete=models.CASCADE)
    preload_date = UnixDateTimeField()
    release_date = UnixDateTimeField()
in_future = Q(release_date__gte=timezone.now())
recent_past = Q(release_date__lt=timezone.now()).order_by('-release_date')[0]

ContentBuildDeviceGroupLink.objects
.filter(in_future & recent_past)
from django.db.models import Subquery, F

recent_dates = ContentBuildDeviceGroupLink.objects.filter(
    release_date__lte=timezone.now()
).order_by('-release_date').values('release_date')

ContentBuildDeviceGroupLink.objects.annotate(
    start_time=Subquery(recent_dates[:1])
).filter(release_date__gte=F('start_time'))
这不起作用并引发错误:

'datetime.datetime' object has no attribute 'order_by'
如何筛选最近具有
release\u date
的对象以及将来具有
release\u date
的所有对象

编辑 我改变了我的方法,所以我首先获取具有最近过去的对象,然后过滤所有大于或等于此日期的对象。但是,当只有一个
ContentBuild
时,下面的查询集可以正常工作,但当有多个相关的
ContentBuild
时,会返回所有旧对象

recent_past = ContentBuildDeviceGroupLink.objects
    .filter(release_date__lte=timezone.now()).order_by('release_date').first()

ContentBuildDeviceGroupLink.objects.filter(release_date__gt=recent_past.release_date)

您可以使用
order\u by
而不是查询集。试试这个

in_future = Q(release_date__gte=timezone.now())
recent_past = Q(release_date__lt=timezone.now())

ContentBuildDeviceGroupLink.objects.filter(
    in_future & recent_past
).order_by('-release_date').first()

您的第二次尝试很接近,但有两个问题:

  • 由于您正在从有序列表中提取
    第一个
    对象,因此这是发布日期最早的人,而不是最近的人
  • 使用
    gt
    而不是
    gte
    似乎有点可疑。。。当只有一个
    ContentBuild
  • 要在单个db查询中获得它,根据django版本的不同,您有两个选项。如果您使用django>=2.0运行,您应该可以这样做(我现在没有一个项目可以测试这个):

    如果您使用的是django<2.0,请尝试以下操作:

    # models.py
    
    class ContentBuild(models.Model):
        content_build_uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
    
    
    class ContentBuildDeviceGroupLink(models.Model):
        uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True)
        content_build_uuid = models.ForeignKey(ContentBuild, on_delete=models.CASCADE, related_name='content_build_deploy')
        group_uuid = models.ForeignKey(DeviceGroup, on_delete=models.CASCADE)
        preload_date = UnixDateTimeField()
        release_date = UnixDateTimeField()
    
    in_future = Q(release_date__gte=timezone.now())
    recent_past = Q(release_date__lt=timezone.now()).order_by('-release_date')[0]
    
    ContentBuildDeviceGroupLink.objects
    .filter(in_future & recent_past)
    
    from django.db.models import Subquery, F
    
    recent_dates = ContentBuildDeviceGroupLink.objects.filter(
        release_date__lte=timezone.now()
    ).order_by('-release_date').values('release_date')
    
    ContentBuildDeviceGroupLink.objects.annotate(
        start_time=Subquery(recent_dates[:1])
    ).filter(release_date__gte=F('start_time'))
    

    也许有一种更聪明的方法,但似乎有效。

    谢谢您的回复。这将导致一个空查询集。可能是因为
    最近的\u pass
    包含所有过去的对象。谢谢您的帮助。我正在运行Django 2.2。您的第一个解决方案将
    Q对象作为错误抛出,该对象不可调用。你的第二个解决方案很有魅力!真奇怪。希望我有一个2.2的项目,我可以尝试它。不管怎样,很高兴另一个人工作了。