仅当通过1:n相关时获取model1对象的最佳方法,最近的model2对象满足过滤器要求

时间:2015-10-21 18:32:27

标签: django django-models

我们得到捆绑相关的1:n跟踪。跟踪已“创建”时间戳和“状态”字段。

必须能够通过状态获得Bundle才意味着只有具有与其相关状态的跟踪的捆绑包和具有状态的跟踪是捆绑的最新(最新)一个捆绑(按“创建”排序“田野”

我们有一些实现但是通过django orm在数据库级别上最好的方法是什么,最小化sql查询的数量。

编辑:模型代码:

class Tracking(DateStampableBase):

    NEW = 0
    PROCESSING_AT_FC = 1
    PACKED = 2
    SHIPPED_TO_PARTICIPANTS = 3
    DELIVERED_TO_PARTICIPANTS = 4
    SHIPPED_TO_LAB = 5
    DELIVERED_TO_LAB = 6

    BUNDLE_STATUSES = (
        (NEW, 'new'),
        (PROCESSING_AT_FC, 'processing_at_fc'),
        (PACKED, 'packed'),
        (SHIPPED_TO_PARTICIPANTS, 'shipped_to_participants'),
        (DELIVERED_TO_PARTICIPANTS, 'delivered_to_participants'),
        (SHIPPED_TO_LAB, 'shipped_to_lab'),
        (DELIVERED_TO_LAB, 'delivered_to_lab'),
    )

    status = models.PositiveSmallIntegerField(choices=BUNDLE_STATUSES, default=NEW)
    bundle = models.ForeignKey(Bundle)


class Bundle(DateStampableBase):
    pass


class DateStampableBase(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

1 个答案:

答案 0 :(得分:0)

在不知道模型结构的情况下,我猜您最好选择使用select_related。这样,您只需命中一次DB即可获得完全填充的Queryset,并使用过滤器,排序等处理该查询集。

https://docs.djangoproject.com/en/1.8/ref/models/querysets/#select-related

编辑:如果我理解正确,你想要这个:

Bundle.objects.filter(tracking__status=1).order_by("tracking__created")

其中1是您要过滤的状态输入。