@Suvenir777

Как сделать запрос по нескольким вложенным полям ForiengKey?

В базе данных хранится список шаблонов форм.

Шаблон формы, это структура, которая задается уникальным набором полей, с указанием их типов.

Пример шаблона формы:

{
"name": "Form template name",
"field_name_1": "email",
"field_name_2": "phone" }

Всего должно поддерживаться четыре типа данных полей:

email
телефон
дата
текст
Все типы кроме текста должны поддерживать валидацию. Телефон передается в стандартном формате +7 xxx xxx xx xx, дата передается в формате DD.MM.YYYY или YYYY-MM-DD.

Имя шаблона формы задается в свободной форме, например MyForm или Order Form. Имена полей также задаются в свободной форме (желательно осмысленно), например user_name, order_date или lead_email.

На вход по урлу /get_form POST запросом передаются данные такого вида: f_name1=value1&f_name2=value2

В ответ нужно вернуть имя шаблона формы, если она была найдена. Чтобы найти подходящий шаблон нужно выбрать тот, поля которого совпали с полями в присланной форме. Совпадающими считаются поля, у которых совпали имя и тип значения. Полей в пришедшей форме может быть больше чем в шаблоне, в этом случае шаблон все равно будет считаться подходящим. Самое главное, чтобы все поля шаблона присутствовали в форме. Я использую Python Django. мой models.py

from django.db import models

class Template(models.Model):
    name = models.CharField(max_length=256, verbose_name='Название шаблона')

    def __str__(self):
       return self.name

    class Meta:
        verbose_name = 'Шаблон'
        verbose_name_plural = 'Шаблоны'

class Field(models.Model):
    class Type:
        choices = (
                 ('email', "email"),
                 ('date', "date"),
                 ('phone', "phone"),
                 ('text', "text"),
             )
    template = models.ForeignKey(Template, related_name='sample', verbose_name='Шаблон', on_delete=models.CASCADE)
    name_field = models.CharField(max_length=256, verbose_name='Имя поля')
    type_field = models.CharField(max_length=5, choices=Type.choices, verbose_name='Тип поля')

    def __str__(self):
        return self.name_field

    class Meta:
        verbose_name = 'Поле'
        verbose_name_plural = 'Поля'

мой view.py

from .utils import type_form
import json
# Create your views here.

class Templates_views (View):
    def post(self, request):
        form_fields_types = form_type(request.GET)
        form_search_cond = Q()  # django.db.models.Q
        for k, v in form_fields_types.items():
            form_search_cond.add(Q(sample__name_field__contains=k, sample__type_field=v), Q.AND)

        template = Template.objects.filter(form_search_cond).annotate(count=Count('id')).order_by('-count')

        return JsonResponse(form_fields_types)

мой utils.py

def type_v(v):
    test = {'email': r'^\S+@\w+.\w{2,4}$',
            'date': r'^\d\d\.\d\d\.\d{4}$',
            'phone': r'^79\s*\d{2}\s*\d{3}\s*\d{2}\s*\d{2}$',
            }
    for t, r in test.items():
        if re.fullmatch(r, v):
            return t

    return 'text'



def type_form(d):
    res = {}
    d = d.dict()
    for k, v in d.items():
        res[k] = type_v(v)
    retur

Из utils.py прилетает словарь вида

{
"User_name": "text",
"User_email": "email",
"date": "date",
"User_phone": "phone"
}

как правильно сделать поиск по данному словарю?

Данные хранятся в моделях таком виде:

{"name": "User",
"sample": [
{
"name_field": "User_name",
"type_field": "text"
},
{
"name_field": "User_email",
"type_field": "email"
},
{
"name_field": "User_phone",
"type_field": "phone"
}
]
}
  • Вопрос задан
  • 119 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы