Как получить Queryset с values_list в django? - PullRequest
0 голосов
/ 20 марта 2020

Здесь у меня есть модель Zipcodes для почтовых индексов, штатов и городов. У меня есть другая модель, которая имеет ключ к почтовым индексам. Здесь я хочу отобразить различные состояния в шаблоне create_person. Для этого я сделал values_list, flat = True, но для создания модели персонажа мне нужен Zipcode Pk, но values_list не дает pk, поэтому я устал использовать методы list_comprehension и ohter. которые приведены ниже в качестве комментария.

Я хочу передать набор запросов в шаблон с различными значениями состояния. Как я могу сделать это здесь?

class Zipcodes(models.Model):
    zip_code = models.CharField(max_length=100, db_column='zipcode')
    city = models.CharField(max_length=200)
    state = models.CharField(max_length=200)

class Person(models.Model):
    state = models.ForeignKey(Zipcodes, on_delete=models.CASCADE)
    full_name = models.CharField(max_length=255)

views

class CreatePersonView(SuccessMessageMixin, generic.CreateView):
    model = Person
    fields = '__all__'
    template_name = 'create_person.html'
    success_url = reverse_lazy('list_persons')
    success_message = 'Created Successfully.'

     def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        all_states = Zipcodes.objects.values_list('state', flat=True).distinct()
        # context['states'] = Zipcodes.objects.filter(state__in=all_states)

        # context['states'] = [state for state in all_states if Zipcodes.objects.filter(state=state)]

        # for state in all_states:
        #     context['states'] = Zipcodes.objects.filter(state=state)
        return context

Шаблон

     <label class="pending--option">State</label>
                <select name="state" class="form-control">
                    {% for state in states %}
                    <option value="{{state.pk}}">
                        {{state.state}}
                    </option>
                    {% endfor %}
                </select>

У меня так много данных в Zip-кодах, что он замедляется в шаблоне при передаче Zipcodes.objects.all() Так что я использовал distinct()

>>> Zipcodes.objects.values_list('state', flat=True).distinct().count()
51
>>> Zipcodes.objects.count()
74022
>>>

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Почему бы не отправить сам набор запросов:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['states'] = Zipcodes.objects.all()
    return context
0 голосов
/ 20 марта 2020

Я решил это с этим

context['states'] = Zipcodes.objects.distinct('state')
...