@paevlk2007

Как организовать поиск по нескольким полям ForeignKey?

Как организовать поиск одним запросом по полям(accessories_material1, accessories_material2, accessories_material3, accessories_material4, accessories_material5 ).
Модель имеет 5 полей со ссылкой на одну модель, сделано для того, чтобы одна из выбранных полей могло уменьшать кол-во в модели Accessories_material, в которой есть приход, и поле с остатком (приход - расход = остаток).
Как можно организовать код, Accessories - одна, в ней до 5 полей Accessories_material, можно сделать ManyToMany, но опять нельзя к каждому из 1 до 5 выбранных полей подставить поле расход, и уменьшить кол-во в Accessories_material. Вот если бы в ManyToMany можно было выводить два поля модели Accessories_material, проблемы была и решена. Кто знать подскажите!!!

class Accessories(models.Model):
    created_on = models.DateTimeField(u"Дата создания", auto_now_add=True)
    accessories_plot = models.ForeignKey(Accessories_plot, verbose_name='Участок')
    accessories_material1 =  models.ForeignKey(Accessories_material)
    accessories_materialr1 = models.IntegerField(u"Расход Кол-во1")
    accessories_material2 =  models.ForeignKey(Accessories_material)
    accessories_materialr2 = models.IntegerField(u"Расход Кол-во2")
    accessories_material3 =  models.ForeignKey(Accessories_material)
    accessories_materialr3 = models.IntegerField(u"Расход Кол-во3")
    accessories_material4 =  models.ForeignKey(Accessories_material)
    accessories_materialr4 = models.IntegerField(u"Расход Кол-во4")
    accessories_material5 =  models.ForeignKey(Accessories_materia)
    accessories_materialr5 = models.IntegerField(u"Расход Кол-во5")


Спасибо!
  • Вопрос задан
  • 2499 просмотров
Пригласить эксперта
Ответы на вопрос 2
@kzlv
Это выглядит как кромешный говнокод, если честно.
Можете описать подробнее? А то совершенно непонятно, что вам нужно. Если отвечать на вопрос из тайтла, то ответ вы и сами знаете:
Accessories.objects.filter(accessories_material1__title='раз',
                           accessories_material2__title='два',
                           accessories_material3__title='и так хоть сколько полей')


А то, что вы описали, совершенно непонятно.
А еще у вас там не дописано название модели в пятой FK:
accessories_material5 =  models.ForeignKey(Accessories_materia)
Ответ написан
@paevlk2007 Автор вопроса
Говнокод в связи с тем, что:
В модели "Accessories" должно быть не менее 5 материалов (модель "Accessories_material"), в модели "Accessories" выбирается материал (поле "accessories_material1" ) и заполняется поле расход материала (поле "accessories_materialr1"). При сохранении формы модели "Accessories" происходит списание (уменьшение) материала:

if f.is_valid():
            if accessories_id:
                f.save()
            else:
                accessories = f.save(commit=False)
                accessories.posted_by = request.user
                if accessories.accessories_material:
                    accessories.accessories_material.accessories_material_col_all = ((accessories.accessories_material.accessories_material_col_all) - (accessories.accessories_material_col_ex))
                    accessories.accessories_material.save()
                    accessories.save()
            ...... и тд


модель "Accessories_materia": (в модель вносится наименование и приход материала, через форму "Accessories" заполняется поле остатки материала "accessories_material_col_all" (приход (Accessories_materia -> accessories_material_col) минус расход (Accessories -> accessories_materialr1) = остаток материала
(Accessories_materia -> accessories_material_col_all.)


class Accessories_material(models.Model):
    accessories_material_date = models.DateField(u"Дата прихода")
    accessories_material = models.CharField("Материал:", max_length=100)
    accessories_material_col = models.IntegerField(u"Приход Кол-во", default=0)
    accessories_material_col_all = models.IntegerField(u"Остатки Кол-во", default=0)

class Accessories(models.Model):
    created_on = models.DateTimeField(u"Дата создания", auto_now_add=True)
    accessories_plot = models.ForeignKey(Accessories_plot, verbose_name='Участок')
    accessories_material1 =  models.ForeignKey(Accessories_material)
    accessories_materialr1 = models.IntegerField(u"Расход Кол-во1")
    accessories_material2 =  models.ForeignKey(Accessories_material)
    accessories_materialr2 = models.IntegerField(u"Расход Кол-во2")
    accessories_material3 =  models.ForeignKey(Accessories_material)
    accessories_materialr3 = models.IntegerField(u"Расход Кол-во3")
    accessories_material4 =  models.ForeignKey(Accessories_material)
    accessories_materialr4 = models.IntegerField(u"Расход Кол-во4")
    accessories_material5 =  models.ForeignKey(Accessories_materia)
    accessories_materialr5 = models.IntegerField(u"Расход Кол-во5")


Понимаю что ГОВНОАДОВЫЙ КОД... но для это здесь и написал, чтобы попросить совета как улучшить код. Как с помощью ManyToMany списывать кол-во материала???
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы