Итерация по полям модели Django с помощью цикла for

У меня есть модель в Django с именем models_bdc

models.py

class models_bdc(models.Model):


    id_bdc = models.CharField(primary_key=True, max_length=50)

    bdc_index_line_1 = models.CharField(max_length=50)
    bdc_quantity_1 = models.CharField(max_length=20)
    bdc_description_1 = models.CharField(max_length=50)
    bdc_index_line_2 = models.CharField(max_length=50)
    bdc_quantity_2 = models.CharField(max_length=100)
    bdc_description_2 =  models.CharField(max_length=100)
    bdc_index_line_3 = models.CharField(max_length=50)
    bdc_quantity_3 = models.CharField(max_length=100)
    bdc_description_3 = models.CharField(max_length=100)

По-моему, я хочу пройтись по полям с помощью цикла for и заменить цифру на значение счетчика i

Это будет выглядеть примерно так :

views.py

queryset = models_bdc.objects.filter(id_bdc=1)

[...]

for i in range(3):
   models_bdc.bdc_index_line_ + i
   models_bdc.bdc_quantity_ + i
   models.bdc.bdc_description_ + i

Но это не работает.

Есть ли способ сделать это?

Спасибо

Итак, во-первых, если вы пытаетесь получить доступ к одиночному объекту, вам следует использовать get, а не filter, поскольку get возвращает одиночный объект, тогда как filter возвращает набор queryset.

instance = get_object_or_404(models_bdc, id_bdc='1')  # Get single object or 404 if not found

Что касается цикла, то вы можете динамически обращаться к полям экземпляра модели Django, используя функцию Python getattr внутри цикла. Вот как вы можете добиться этого в вашем представлении:

def your_view(request):
    queryset = models_bdc.objects.filter(id_bdc='1')  # Assuming '1' is a valid id_bdc
    if queryset.exists():
        instance = queryset.first()

        for i in range(1, 4):  # Range should be from 1 to 4 because your fields are indexed from 1 to 3
            index_field = f'bdc_index_line_{i}'
            quantity_field = f'bdc_quantity_{i}'
            description_field = f'bdc_description_{i}'

            index_value = getattr(instance, index_field)
            quantity_value = getattr(instance, quantity_field)
            description_value = getattr(instance, description_field)

            # Replace or process the values as needed
            print(index_value, quantity_value, description_value)

Если вы пытаетесь реализовать это для нескольких объектов, то filter - это способ, и вы просто добавляете цикл для самого queryset:

 queryset = models_bdc.objects.filter(id_bdc='1')  # Assuming '1' is a valid id_bdc

 for instance in queryset:
        for i in range(1, 4): 
            ...
Вернуться на верх