django查询模型A并从相关模型B中排除某些项

django查询模型A并从相关模型B中排除某些项,django,django-models,orm,model,Django,Django Models,Orm,Model,我是Django的新手,我面临着一个在Stackoverflow上没有答案的问题。 基本上,我有两种型号,客户和订单定义如下: class Client(models.Model): name = models.CharField(max_length=200) registration_date = models.DateTimeField(default=timezone.now) # .. class Order(models.Model): Client = mode

我是Django的新手,我面临着一个在Stackoverflow上没有答案的问题。 基本上,我有两种型号,客户和订单定义如下:

class Client(models.Model):
  name = models.CharField(max_length=200)
  registration_date = models.DateTimeField(default=timezone.now)
  # ..


class Order(models.Model):
  Client = models.ForeignKey(ModelA, on_delete=models.CASCADE, related_name='orders')
  is_delivered = models.BooleanField(default=False)
  order_date = models.DateTimeField(default=timezone.now)
  # ..        
我希望我的查询集
客户端\u结果
满足以下两个条件:

  • 客户端对象满足某些条件(例如,它们的名称以“d”开头,并在2019年注册,但可能更复杂)
  • 我可以使用“related_name”中定义的
    orders
    关系访问的Order对象仅是满足其他条件的对象;例如,订单未交付且在过去6周内完成
我可以直接在模板中这样做,但我觉得这不是正确的方法。 此外,我在文章中读到,Order中的Base Manager不应用于此目的。 最后,我用Q和F找到了一个相对接近我的,但最后,我会得到订单号,而理想情况下,我希望得到整个对象

你能告诉我解决这个问题的最佳方法吗

非常感谢你的帮助

您可能应该使用here获取每个
客户机的相关未交付
订单
,并将其存储在
客户机
中,但随后存储在不同的属性中,因为否则会产生混淆

因此,您可以创建一个查询集,如:

from django.db.models import Prefetch
from django.utils.timezone import now
from datetime import timedelta

last_six_weeks = now() - timedelta(days=42)

clients_results = Client.objects.filter(
    name__startswith='d'
).prefetch_related(
    Prefetch(
        'orders',
        Order.objects.filter(is_delivered=False, order_date__gte=last_six_weeks),
        to_attr='nondelivered_orders'
    )
)
从django.db.models导入预取
从django.utils.timezone立即导入
从日期时间导入时间增量
最近六周=现在()-timedelta(天=42)
clients\u results=Client.objects.filter(
名称\uuu以='d'开头
).prefetch_相关(
预取(
“命令”,
Order.objects.filter(是否已交付=False,订单日期=最后六周),
发送至\u attr='未交货订单'
)
)
这将包含名称以
'd'
开头的所有
客户机
,由此查询集生成的每个
客户机
对象将具有一个属性
未交付的订单
,该属性包含过去42天内未交付和订购的
订单列表