Python Django Admin按函数筛选/仅按反向外键查找中的第一个对象筛选
我试图在django中构建一个按函数筛选的过滤器。从谷歌上我了解到,这是很难做到的 这是我的代码:Python Django Admin按函数筛选/仅按反向外键查找中的第一个对象筛选,python,django,filter,Python,Django,Filter,我试图在django中构建一个按函数筛选的过滤器。从谷歌上我了解到,这是很难做到的 这是我的代码: class TrackingEventType(models.Model): name = models.CharField(blank=False, null=False, max_length=255) class TrackingEvent(models.Model): datetime = models.DateTimeField(blank=False, nul
class TrackingEventType(models.Model):
name = models.CharField(blank=False, null=False, max_length=255)
class TrackingEvent(models.Model):
datetime = models.DateTimeField(blank=False, null=False, default=datetime.now, verbose_name="Zeitpunkt")
event_type = models.ForeignKey(TrackingEventType, help_text="Art des Events")
tracking = models.ForeignKey('Tracking')
class Meta:
ordering = ['-datetime']
class Tracking(models.Model):
tracking_no = models.CharField(blank=False, null=False, max_length=10, unique=True, verbose_name="Tracking Nummer")
def get_last_event(self):
"""
Todo: return the latest event.
"""
return TrackingEvent.objects.filter(tracking=self.id).first()
get_last_event.short_description = 'Last event'
class Meta:
ordering = ['-tracking_no']
我的目标是使跟踪对象按其最后事件类型名称进行过滤成为可能。在django admin中显示函数的结果很容易,但添加相应的过滤器却不容易
我的想法也是尝试构建一个过滤器,比如:
trackingevent__set__first__event_type__name
但是是的,那太容易了:)
欢迎任何输入。正如您所发现的那样,以这种方式进行过滤并不简单。如果您定期访问这些信息,那么它可能也不是很有效 我建议您在
跟踪
模型本身中存储对最新跟踪事件的引用:
class Tracking(models.Model)
# ...
last_event = models.ForeignKey(TrackingEvent, null=True)
然后,每当创建新的跟踪事件时,您将使用更新此引用。大致如下:
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=TrackingEvent)
def update_latest_tracking_event(sender, instance, created, **kwargs):
# Is this a new event?
if created:
# If yes, then update the Tracking reference
tracking = instance.tracking
tracking.last_event = instance
tracking.save()
(请阅读有关将此代码放置在何处的文档)
一旦所有这些都到位,就可以很容易地根据上一个跟踪事件类型进行过滤:
# I'm just guess what event types you have...
cancellation = TrackingEventType.objects.get(name='cancel')
Tracking.objects.filter(last_event__event_type=cancellation)
方法确实很好!事实上,对于我的用例来说甚至是完美的,因为我已经在使用信号发送关于TrackingEvent创建的电子邮件了!非常感谢,我会尝试着把我的发现带回来!就是这样做的,谢谢你把我推向正确的方向