Итерация по полям модели 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):
...