Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 19, 2017 07:49:03

rquid
Зарегистрирован: 2017-08-10
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Django, удалить из Queryset определённые поля.

Делаю так:

 fields = [field.name for field in model._meta.fields]
fields.remove('name_of_field')
q_resp = model.objects.filter(fields=fields)
return render(req,'template.html', {'q_resp': q_resp}
Получаю:
 FieldError at %url%
Cannot resolve keyword 'fields' into field. Choices are: разные названия полей
Такое возможно сделать? Хотел использовать один темплэйт, но в зависимости от входных данных разные поля подставлять(проверять по наличию существования).

Офлайн

#2 Дек. 19, 2017 08:15:30

Elaphe
Зарегистрирован: 2015-02-04
Сообщения: 125
Репутация: +  5  -
Профиль   Отправить e-mail  

Django, удалить из Queryset определённые поля.

А зачем их из queryset удалять?
Если в у вас есть только q.foo, но нет q.bar, то запись в темплейте {{ q.bar }} не вызовет ошибки, там просто будет пустое место.
Поэтому можно написать:
{{ q.foo }}{{ q.bar }}
И в зависимости от наличия, подставится или первое, или второе, или оба.
Ну или покажите, что вы примерно хотите сделать в темплейте в итоге.

Отредактировано Elaphe (Дек. 19, 2017 08:16:37)

Офлайн

#3 Дек. 19, 2017 08:18:04

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Django, удалить из Queryset определённые поля.

 fields = {}
field["date__gt"] = date
fields["type"] = "product"
model.objects.filter(**fields)



Офлайн

#4 Дек. 19, 2017 09:23:04

rquid
Зарегистрирован: 2017-08-10
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Django, удалить из Queryset определённые поля.

Elaphe, у меня в одной модели оба поля со значениями, если в темлэйте оба указываешь, то оба и будут, а надо в зависимости от переданных данных показывать одно из них в темлэйте.
FishHook, спасибо, забыл про распаковку списков, остался вопрос, когда ForeignKey передаёшь через filter().values(), он отображает id, а хотелось бы значение.

Офлайн

#5 Дек. 19, 2017 09:41:18

Elaphe
Зарегистрирован: 2015-02-04
Сообщения: 125
Репутация: +  5  -
Профиль   Отправить e-mail  

Django, удалить из Queryset определённые поля.

Ну тогда так:

{% if q.foo %}{{ q.foo }}{% else %}{{ q.bar }}{% endif %}

Отредактировано Elaphe (Дек. 19, 2017 09:49:19)

Офлайн

#6 Дек. 19, 2017 13:10:01

rquid
Зарегистрирован: 2017-08-10
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Django, удалить из Queryset определённые поля.

Elaphe, q.foo всегда будет true, ибо всегда есть значения в этих полях weight_load models.FloatField(default=0), weight_unload = models.FloatField(default=0), я доку читаю, просто ещё не освоился

 class Race(models.Model):
    id_race = models.AutoField(primary_key=True)
    name_race = models.CharField(max_length=5, default='Рейс')
    race_date = models.DateField(default=date.today)
    car = models.ForeignKey(Car)
    driver = models.ForeignKey(Driver)
    type_ship = models.BooleanField(default=0)
    supplier = models.ForeignKey(Supplier)
    customer = models.ForeignKey(Customer)
    shipment = models.ForeignKey(Shipment, null=True, blank=True)
    product = models.ForeignKey(Product)
    mediator = models.ForeignKey(Mediator, null=True, blank=True)
    s_milage = models.FloatField(default=0)
    e_milage = models.FloatField(default=0)
    weight_load = models.FloatField(default=0)
    weight_unload = models.FloatField(default=0)
    comm = models.TextField(null=True, blank=True)
    state = models.IntegerField(default=0)
    create_time = models.DateTimeField(auto_now=True)

Офлайн

#7 Дек. 19, 2017 15:06:38

Elaphe
Зарегистрирован: 2015-02-04
Сообщения: 125
Репутация: +  5  -
Профиль   Отправить e-mail  

Django, удалить из Queryset определённые поля.

Офлайн

#8 Дек. 21, 2017 05:45:18

rquid
Зарегистрирован: 2017-08-10
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Django, удалить из Queryset определённые поля.

Elaphe, я же решил уже вот так:

 fields = [field.name for field in Race._meta.fields]
fields.remove('weight_load')
q_resp = Race.objects.filter(customer__inn__exact=req.POST.get('inn'),
race_date__range=[req.POST.get('from'), req.POST.get('to')]).values(*fields)
for obj in q_resp:
        obj['car'] = Car.objects.get(id_car=obj.get('car')).number
        obj['product'] = Product.objects.get(id_product=obj.get('product')).name
незнаю, насколько правильно я делаю, но оно делает, что я хотел. А с defer я тоже пробовал и всё равно поля в темплэйт оба попадали.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version