我想在Django中创建一个管理器,用于过滤id和传感器。这是我的经理:
class BrokenDeviceManager(models.Manager):
def get_queryset(self, device_id, sensor):
return (
super()
.get_queryset()
.filter(brokensensor__exact=device_id, brokensensor__sensor=sensor,)
)
当在测试类中尝试此操作时:
Device.broken_objects.filter(
device_id=device.id, sensor=Sensor.COUGHS
).count()
它给了我:
TypeError: get_queryset() missing 2 required positional arguments: 'device_id' and 'sensor'
也尝试了其他方法,没有成功。这是brokensensor类:
class BrokenSensor(models.Model):
sensor = models.PositiveIntegerField(choices=Sensor.choices())
device = models.ForeignKey(
Device, on_delete=models.CASCADE, related_name="brokensensor"
)
def __str__(self): # pragma: no cover
return "pk{} - device: {} - sensor: {}".format(
self.pk, self.device_id, self.sensor
)
2条答案
按热度按时间carvr3hs1#
查看您的问题和您问题的评论部分的给定解决方案:
它似乎可以完成这项工作,但是对于该解决方案,我相信更好的方法是使用
QuerySet
。这是一个更简单的接口,它扩展了链接方法,并允许您以任何您喜欢的顺序调用它。另外,Manager
应该在没有特殊方法或参数的情况下工作,因为它的想法是在后台工作并自己完成所有的“魔术”,通常覆盖get_queryset()
。因此,要使用
Queryset
,您必须首先声明一个Queryset
及其方法,然后使用.as_manager()
添加到模型中。我看到你的解决方案的问题是它不允许链接,例如:
Device.broken_objects.all().broken_sensor_check()
不能用它来做。yhived7q2#
对于那些寻找经理根据条件进行过滤的人来说,以下是我的解决方案:
因此,您可以在模型上创建两个管理器,例如:
然后打电话给
这对我很有用,因为过滤器是外键的级联,所以我可以简化编写: