Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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 Admin按函数筛选/仅按反向外键查找中的第一个对象筛选_Python_Django_Filter - Fatal编程技术网

Python Django Admin按函数筛选/仅按反向外键查找中的第一个对象筛选

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

我试图在django中构建一个按函数筛选的过滤器。从谷歌上我了解到,这是很难做到的

这是我的代码:

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创建的电子邮件了!非常感谢,我会尝试着把我的发现带回来!就是这样做的,谢谢你把我推向正确的方向