代码之家  ›  专栏  ›  技术社区  ›  Nico44044

使用for循环遍历Django模型字段

  •  1
  • Nico44044  · 技术社区  · 1 年前

    我在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
    

    但它不起作用。

    有办法做到这一点吗?

    谢谢

    1 回复  |  直到 1 年前
        1
  •  1
  •   haduki    1 年前

    好吧,首先,如果你试图访问一个你应该使用的对象 get 而不是 filter 自从 得到 返回单个对象,而 滤波器 返回一个查询集。

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

    至于循环,你可以使用Python动态访问Django模型实例的字段 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)
    
    

    如果你试图为多个对象实现这一点,那么 滤波器 就是这样,你只需为它添加一个循环 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): 
                ...