gpt4 book ai didi

python - 如何通过多对多字段的模型进行过滤?

转载 作者:太空狗 更新时间:2023-10-29 23:57:53 25 4
gpt4 key购买 nike

我正在尝试为卡车车队实现地理围栏。我必须将边界列表与车辆相关联。最重要的是,其中一项要求是保留所有内容,即使出于审计目的而将其删除。因此我们必须对所有内容进行软删除。这就是问题所在。我的多对多字段不符合软删除管理器,它包括查找数据集中的事件记录和非事件记录。

class Vehicle(SoftDeleteModel):
routes = models.ManyToManyField('RouteBoundary', through='VehicleBoundaryMap', verbose_name=_('routes'),
limit_choices_to={'active': True})


class VehicleBoundaryMap(SoftDeleteModel):
vehicle = models.ForeignKey(Vehicle, verbose_name="vehicle")
route_boundary = models.ForeignKey(RouteBoundary, verbose_name="route boundary")
# ... more stuff here

alive = SoftDeleteManager()


class SoftDeleteManager(models.Manager):

use_for_related_fields = True

def get_queryset(self):
return SoftDeleteQuerySet(self.model).filter(active=True)

正如您在上面看到的,我试图确保默认管理器是一个软删除管理器(即仅针对事件记录进行过滤)并且还尝试使用 limit limit_choices_to 但结果只显示外部模型而不是“通过”我想要的模型。如果您有任何建议或建议,我很乐意听取您的意见。

谢谢!

最佳答案

第一个问题:您对 limit_choices_to 的使用将不起作用,因为 documentation says :

limit_choices_to has no effect when used on a ManyToManyField with a custom intermediate table specified using the through parameter.

您正在使用 through,因此 limit_choices_to 无效。

第二个问题:您使用 use_for_related_fields = True 也是无效的。 documentation说到这个属性:

If this attribute is set on the default manager for a model (only the default manager is considered in these situations), Django will use that class whenever it needs to automatically create a manager for the class.

您的自定义管理器分配给 VehicleBoundaryMapalive 属性,而不是 objects,因此它会被忽略。

我认为可能有效的一种方法是:

  1. 创建 proxy model对于 VehicleBoundaryMap。我们称它为 VehicleBoundaryMapProxy。设置它,使其默认管理器为 SoftDeleteManager() 类似于:

    class VehicleBoundaryMapProxy(VehicleBoundaryMap):
    class Meta:
    proxy = True

    objects = SoftDeleteManager()
  2. through='VehicleBounddaryMapProxy' 在您的 ManyToManyField 上:

     class Vehicle(SoftDeleteModel):
    routes = models.ManyToManyField('RouteBoundary',
    through='VehicleBoundaryMapProxy',
    verbose_name=_('routes'))

关于python - 如何通过多对多字段的模型进行过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37751422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com