How to convert a list in to queryset django

前端 未结 4 653
盖世英雄少女心
盖世英雄少女心 2021-02-04 09:27

I have a queryset(which is filtered actually) as below

posts = [, , , , 

        
相关标签:
4条回答
  • 2021-02-04 09:33

    The previous answers are correct if each list item already exists in the database, but sometimes this is not the case. In this case you can create a queryset stub based on the list and implement queryset-methods and queryset-properties as needed.

    class ListAsQuerySet(list):
    
        def __init__(self, *args, model, **kwargs):
            self.model = model
            super().__init__(*args, **kwargs)
    
        def filter(self, *args, **kwargs):
            return self  # filter ignoring, but you can impl custom filter
    
        def order_by(self, *args, **kwargs):
            return self
    
    qs = ListAsQuerySet(custom_list, model=Post)
    
    0 讨论(0)
  • 2021-02-04 09:44

    Here's a simple util that you can run to produce a QS from a list:

    def list_to_queryset(model, data):
        from django.db.models.base import ModelBase
    
        if not isinstance(model, ModelBase):
            raise ValueError(
                "%s must be Model" % model
            )
        if not isinstance(data, list):
            raise ValueError(
                "%s must be List Object" % data
            )
    
        pk_list = [obj.pk for obj in data]
        return model.objects.filter(pk__in=pk_list)
    
    0 讨论(0)
  • 2021-02-04 09:45

    Actually i had found one way by googling, but this may take a lot of time for querying/generating results if there are huge number of records

    custom_list = [rec.id for rec in posts if 'string_or_field' in rec.tags.all()]
    
    querset = MyModel.objects.filter(id__in=custom_list)
    
    0 讨论(0)
  • 2021-02-04 09:54

    You can query the Tag object first and filter Post with those ids:

    tags = Tag.objects.filter(field_name='string_or_field')
    posts = Post.objects.filter(tags__in=tags)
    
    0 讨论(0)
提交回复
热议问题