簡體   English   中英

Django 注釋來自另一個模型的字段值

[英]Django annotate field value from another model

我想用另一個歷史模型中的值注釋 MyModel 查詢集。 我的模型關系如下:

class Stage(models.Model):
    name = models.CharField()


class History(models.Model):
    mymodel = models.ForeignKey(
        MyModel,
        on_delete=models.CASCADE,
    )
    stage = models.ForeignKey(
        Stage,
        on_delete=models.DO_NOTHING
     )
    created_at = models.DateTimeField(
        auto_now_add=True
    )

class MyModel(models.Model):
    id = models.AutoField(
        primary_key=True,
    )
    ...

我想在 ViewSet 中執行的近似操作(order_by 我需要獲取最新階段):

class MyModelViewSet(viewsets.ModelViewSet):
    ...
    def get_queryset(self):
        qs = super(MyModelViewSet, self).get_queryset()
        qs = qs.annotate(last_stage_name=Value(
            History.objects.filter(mymodel__id=F('id')).order_by('-created_at')[0].stage.name,
            output_field=CharField()))

但是我從第一個對象而不是每個對象的最新階段獲得所有對象的相同階段,因此操作邏輯是錯誤的。 我想我應該擺脫 History.objects.filter 但找不到合適的解決方案。

您可以使用Subquery表達式 [Django-doc]

from django.db.models import OuterRef, Subquery

class MyModelViewSet(viewsets.ModelViewSet):
    
    # …
    
    def get_queryset(self):
        return super().get_queryset().annotate(
            last_stage_name=Subquery(
                History.objects.filter(
                    mymodel_id=OuterRef('pk')
                ).order_by('-created_at').values('stage__name')[:1]
            )
        )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM