При сохранении ModelFormSet считывается вся базовая таблица?
Я не знаю, как объяснить проблему в моем заголовке, поэтому, если кто-то знает, как лучше сформулировать проблему, которую я собираюсь описать, я надеюсь, что есть способ обновить плитку.
Должен сказать, что я уже пытался искать решение в google, но не смог найти ничего полезного. Я попытался следовать видео-учебнику (после прочтения официальной документации Django, конечно) Видео 01 Видео 02
Я использую старую версию Django, потому что мне нужно подключиться к базе данных MS SQL, и эта смесь python+django+mssql-backend - единственная работающая комбинация (я пробовал с последней версией Django и Python, но мне пришлось повозиться с mssql-backend, потому что было много ошибок об устаревших функциях, например ugettext_lazy вместо gettext_lazy и многое другое...)
Я пытаюсь создать небольшой интерфейс к уже существующей базе данных MS SQL (поэтому я не могу изменить структуру базы данных). Я все еще изучаю Django, так что я почти уверен, что проблема моя, я что-то неправильно понял :(
В настоящее время я создал страницу для поиска интересующих строк в таблице базы данных и страницу для редактирования всех результирующих строк из предыдущего поиска. Когда я отправляю форму с параметром поиска, я могу создать queryset, чтобы показать правильную форму для редактирования (например, поиск по номеру клиента, имени клиента и так далее). Но когда я что-то редактирую (например, меняю имя клиента...) и отправляю с помощью кнопки сохранения, "вызывается" правильный AnagraficheEditView (о котором сообщается ниже), но у меня больше нет фильтра поиска, поэтому я могу создать тот же кверисет, единственное, что я могу сделать
aefs = formset(request.POST or None, request.FILES or None)
Проблема в том, что при вызове formset.is_valid() django пытается выбрать из основной таблицы все строки (а у меня сейчас около 16 миллионов строк в этой таблице, так что это немного медленно :) )
Мне кажется, что я упускаю что-то важное.
Спасибо за любое предложение
forms.py
from django import forms
from django.db.models import query
from django.utils.translation import gettext_lazy as _
from .models import Anagrafiche
class AnagraficheSearchForm(forms.Form):
idbatch = forms.IntegerField(required=True, label='ID Batch')
iderrore = forms.CharField(max_length=256, required=False, label='Errore')
codiceclifor = forms.CharField(max_length=64, required=False, label='Codice Cliente')
denominazione = forms.CharField(max_length=512, required=False, label='Denominazione')
cfisc = forms.CharField(max_length=16, required=False, label='Codice Fiscale')
piva = forms.CharField(max_length=11, required=False, label='Partita Iva')
class AnagraficheEditForm(forms.ModelForm):
class Meta:
model: Anagrafiche
fields = ['idbatch', 'mandante', 'societa', 'codiceclifor', 'nome', 'cognome', 'ragsoc', 'cfisc', 'piva', 'codicedestinatariosdi', 'iderrore']
labels = {
'idbatch': _('ID Batch'),
'mandante': _('Mandante'),
'societa': _('Societa'),
'codiceclifor': _('Codice Cliente'),
'nome': _('Nome'),
'cognome': _('Cognome'),
'ragsoc': _('Ragione Sociale'),
'cfisc': _('Codice Fiscale'),
'piva': _('Partita Iva'),
'codicedestinatariosdi': _('Codice SDI'),
'iderrore': _('Errore'),
}
widgets = {
'idbatch': forms.HiddenInput(),
'mandante': forms.HiddenInput(),
'societa': forms.HiddenInput(),
'codiceclifor': forms.HiddenInput(),
}
Models.py
from django.db import models
from django.utils import translation
# Create your models here.
class Anagrafiche(models.Model):
idbatch = models.IntegerField(db_column='IDBatch', primary_key=True) # Field name made lowercase.
mandante = models.CharField(db_column='Mandante', max_length=64) # Field name made lowercase.
societa = models.CharField(db_column='Societa', max_length=64) # Field name made lowercase.
codiceclifor = models.CharField(db_column='CodiceCliFor', max_length=64) # Field name made lowercase.
nome = models.CharField(db_column='Nome', max_length=256, blank=True, null=True) # Field name made lowercase.
cognome = models.CharField(db_column='Cognome', max_length=256, blank=True, null=True) # Field name made lowercase.
ragsoc = models.CharField(db_column='RagSoc', max_length=256, blank=True, null=True) # Field name made lowercase.
#more fields here, removed for simplicity
cfisc = models.CharField(db_column='CFisc', max_length=32, blank=True, null=True) # Field name made lowercase.
piva = models.CharField(db_column='PIVA', max_length=32, blank=True, null=True) # Field name made lowercase.
codicedestinatariosdi = models.CharField(db_column='CodiceDestinatarioSDI', max_length=64, blank=True, null=True) # Field name made lowercase.
iderrore = models.IntegerField(db_column='IDErrore', blank=True, null=True) # Field name made lowercase.
class Meta:
managed = False
#SQL Schemas :)
db_table = 'enerp].[Anagrafiche'
unique_together = (('idbatch', 'mandante', 'societa', 'codiceclifor'),)
verbose_name = "Anagrafica"
verbose_name_plural = "Anagrafiche"
def __str__(self):
if self.cognome != None:
return self.codiceclifor + ' ' + self.cognome + ' ' + self.nome
else:
if self.ragsoc != None:
return self.codiceclifor + ' ' + self.ragsoc
else:
return self.codiceclifor
views.py
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.ENERP),
path('AnagraficheSearch', views.AnagraficheSearchView),
path('AnagraficheEdit', views.AnagraficheEditView),
]
Шаблон Master DataEditPage.html