通过ORM提出这种复杂请求的正确方法是什么?

时间:2017-07-29 03:03:02

标签: python django django-models orm django-queryset

让我们说我们有以下模型:

class Bundle(models.Model):
    # ...

class Order(models.Model):
    # ...
    bundle = models.ForeignKey(
        Bundle, on_delete=models.CASCADE,
        verbose_name=_('бандл'), 
        related_name='orders')

class CommentThread(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, verbose_name=_('user'),
        blank=True, null=True, related_name="%(class)s_comments",
        on_delete=models.SET_NULL)

    content_type = models.ForeignKey(
        ContentType,
        verbose_name=_('content type'),
        related_name="content_type_set_for_%(class)s",
        on_delete=models.CASCADE)
    object_pk = models.TextField(_('object ID'))
    content_object = GenericForeignKey(ct_field="content_type", fk_field="object_pk")
    datetime = models.DateTimeField(verbose_name=_('last time thread was read'), default=None,
                                    null=True, blank=True)

class Comments(models.Model):
    content_type = models.ForeignKey(
        ContentType,
        verbose_name=_('content type'),
        related_name="content_type_set_for_%(class)s",
        on_delete=models.CASCADE)
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, verbose_name=_('user'),
        blank=True, null=True, related_name="%(class)s_comments",
        on_delete=models.SET_NULL)
    content_object = GenericForeignKey(ct_field="content_type", fk_field="object_pk")
    object_pk = models.TextField(_('object ID'))

    text = models.TextField(max_length=COMMENT_MAX_LENGTH)
    submit_date = models.DateTimeField(_('date/time submitted'), default=None, db_index=True)

根据设计,我们可能会将评论附加到每个模型,但在这种情况下,我们会在内容类型\对象ID泛型上附加对Bundle的评论。要为线程中的每个用户实现“读取\未读评论”,我们使用具有相同内容类型对象通用的CommentThread模型(我知道,这是一个很糟糕的想法,但这是一种遗留代码)。

如果Bundle实例附加了comment.submit_date>的评论comment_thread.objects.filter(user=user, content_object=bundle).datetime这个意思是对当前用户来说是新的评论。

因此,我需要获取Orders的列表,其中包含针对用户的新评论,按提交上次评论的时间排序,附加到Order.bundle,每个Order的评论数量为< / p>

问题是:ORM以正确的方式提出此请求?可能吗?

0 个答案:

没有答案