Как перебирать поля модели Django и добавлять значения на основе условия - PullRequest
1 голос
/ 31 октября 2019

У меня есть модель, которая имитирует линию поезда до 30 станций, поэтому модель имеет 30 полей, которые можно обнулять.

models.py

class TempLine(models.Model):
    picking_mode = models.IntegerField(default=1)
    start_station = models.CharField(max_length=2000)
    end_station = models.CharField(max_length=2000, null=True)
    station_1 = models.CharField(max_length=2000, null=True)
    station_2 = models.CharField(max_length=2000, null=True)
    station_3 = models.CharField(max_length=2000, null=True)
    station_4 = models.CharField(max_length=2000, null=True)
    station_5 = models.CharField(max_length=2000, null=True)
    station_6 = models.CharField(max_length=2000, null=True)
    station_7 = models.CharField(max_length=2000, null=True)
    station_8 = models.CharField(max_length=2000, null=True)
    station_9 = models.CharField(max_length=2000, null=True)
    station_10 = models.CharField(max_length=2000, null=True)
    station_11 = models.CharField(max_length=2000, null=True)
    station_12 = models.CharField(max_length=2000, null=True)
    station_13 = models.CharField(max_length=2000, null=True)
    station_14 = models.CharField(max_length=2000, null=True)
    station_15 = models.CharField(max_length=2000, null=True)
    station_16 = models.CharField(max_length=2000, null=True)
    station_17 = models.CharField(max_length=2000, null=True)
    station_18 = models.CharField(max_length=2000, null=True)
    station_19 = models.CharField(max_length=2000, null=True)
    station_21 = models.CharField(max_length=2000, null=True)
    station_22 = models.CharField(max_length=2000, null=True)
    station_23 = models.CharField(max_length=2000, null=True)
    station_24 = models.CharField(max_length=2000, null=True)
    station_25 = models.CharField(max_length=2000, null=True)
    station_26 = models.CharField(max_length=2000, null=True)
    station_27 = models.CharField(max_length=2000, null=True)
    station_28 = models.CharField(max_length=2000, null=True)
    station_29 = models.CharField(max_length=2000, null=True)
    station_30 = models.CharField(max_length=2000, null=True)

Данные добавляются один за другим с помощью ajax-запроса.

, поэтому мне нужно пройтись по всем полям, начиная с station_1 ..проверить, если это не так, добавить .. если нет .. просто перейти к следующему.

вот какЯ пытался сделать это:

def adding_inline_stations(request):
    in_line_station = request.GET.get('inLine_stations', None)
    obj = TempLine.objects.filter()[0]
    for f in obj._meta.get_fields[3:]:
        if f is None:
            f = in_line_station
            f.save()
        else:
            pass

, который возвращает ошибку TypeError: 'method' object is not subscriptable

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Вы должны сделать модель станции. Хотя в данный момент вам нужно только название станции, она может довольно быстро перерасти в необходимость местоположения, времени открытия и т. Д.

После того, как вы сделали такую ​​модель (даже если у нее всего однаполе в минуту с именем), создайте связь «многие ко многим» со своей линией и получите к ним доступ так же, как и к любому другому связанному полю модели.

Как правило программирования, если вы называете переменныеvariable_n, тогда пришло время переосмыслить, если вам нужно хранить эти объекты в какой-то коллекции

1 голос
/ 31 октября 2019

Сначала ошибка: <Model>._meta.get_fields это метод, а не атрибут;поэтому вам нужно:

for f in obj._meta.get_fields()[3:]:
# Note the call:             ^^

Теперь ваш дизайн не выглядит правильным. То, что вы делаете, это в основном призыв к связи с Station моделью. Итак, создайте модель Station с, например, полем name, содержащим название станции (и другие поля по мере необходимости). Также убедитесь, что вы четко продумываете отношения для использования с моделью Line;на первый взгляд, это выглядит как многие ко многим.

...