简体   繁体   中英

"Django" filter by last status

I want to filter according to last added element of related model with foreignkey relationship field. I try a lot but can not achieve, My models like this

class Status(models.Model):
    
    member= models.ForeignKey(Member, on_delete=models.CASCADE, related_name='member_status')
    name = models.CharField(max_length=20, choices=("new","old","continue")
    notes= models.CharField(max_length=200)
    status_created_at = models.DateTimeField(auto_now_add=True)


class Member(models.Model):
    messageContent= models.TextField(null=True, blank=True)

my queryset like this

{
    "id": 1,
    "member_status": [
        {
            "id": 8,
            "name": "new",
            "notes": "",
            "status_created_at": "2021-01-01T17:55:21.523162Z",
            "member": 1
        },
        {
            "id": 9,
            "name": "old",
            "notes": "",
            "status_created_at": "2022-08-09T17:56:06.995086Z",
            "order": 1
        }
    ],
    "messageContent": "example",
},
            "id": 1,
    "member_status": [
        {
            "id": 11,
            "name": "new",
            "notes": "",
            "status_created_at": "2021-01-01T17:55:21.523162Z",
            "member": 1
        },
        {
            "id": 12,
            "name": "continue",
            "notes": "",
            "status_created_at": "2022-08-08T17:56:06.995086Z",
            "order": 1
        }
    ],
    "messageContent": "example content",
}

for filtering with FilterSet

def filter_queryset(self, queryset):
    queryset= Member.objects.filter(member_status__name=self.request.query_params.get('memberStatus'))
    return super().filter_queryset(queryset)

I want to filter according to last member status but when filter with "new", all objects get with queryset. I want to get members filtered by last status.

Can you help me, please?

I can not find exact answer from web but this is enough for me now. I add this solution

def filter_queryset(self, queryset):
    queryset = Status.objects.filter(id__in=Status.objects.values("member").annotate(max_id=Max('id')).values("max_id"),name=self.request.query_params.get('status'))
    queryset = Member.objects.filter(member_status__in=queryset)
    return super().filter_queryset(queryset)

this code script is very complex so I think may be anyone share a clear solution

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM