How can I filter values ​from one model and insert the result into the form as choices?

Good day!

I have two tables - models. I fill them gradually. First I have the first table. First I enter data into the first table.

And there - in the first table I have - repeating data. Field - (name_object) - is repeated and can have the same rows. Also even more repeated field - name_working.

I plan to include filtered values ​​(name_working) in the second form.

How can I filter values ​​in the model table - CreateNewGPR by - (name_object) - which is like pk .

And insert the received data into the form as select or choices .

models.py

class CreateNewGPR (models.Model):
    name_object = models.IntegerField(verbose_name="Наименование объекта")
    name_working = models.CharField(verbose_name="Наименование работы")
    type_izm = models.CharField(choices=TYPE_IZMERENIYA, verbose_name="Единицы измерения")
    value_work = models.FloatField(verbose_name="Объём работ")
    lyudi_norma = models.IntegerField(verbose_name="Нормативные затраты персонала")
    technik_norma = models.IntegerField(verbose_name="Нормативные затраты техники")
    date_begin = models.DateField(verbose_name="Дата начала работ")
    date_end = models.DateField(verbose_name="Дата окончания работ")


class CreateNewWorkDay (models.Model):
    name_object = models.IntegerField(verbose_name="Наименование объекта")
    name_working = models.CharField(verbose_name="Наименование работы по ГПР")
    second_name_working = models.CharField(verbose_name="Фактическое наименование работы")
    third_name_working = models.TextField(verbose_name="Описание работы")
    type_izm = models.CharField(choices=TYPE_IZMERENIYA, verbose_name="Единицы измерения")
    value_work_fact = models.FloatField(verbose_name="Объём работ фактический")
    lyudi_norma = models.IntegerField(verbose_name="Нормативные затраты персонала")
    technik_norma = models.IntegerField(verbose_name="Нормативные затраты техники")
    lyudi_fact = models.IntegerField(verbose_name="Фактические затраты персонала")
    technik_fact = models.IntegerField(verbose_name="Фактические затраты техники")
    date_day = models.DateField(verbose_name="Дата")

forms.py

class FormOne (forms.ModelForm):
    class Meta:
        model = ArkiObject_1
        fields = "__all__"
        widgets = {
            "date_contract": forms.DateInput(attrs={"class":"form-control", "type":"date"})
        }


class Form_GPR (forms.ModelForm):
    class Meta:
        model = CreateNewGPR
        fields = "name_working", "type_izm", "value_work", "lyudi_norma", "technik_norma", "date_begin", "date_end"
        widgets = {
            "date_begin": forms.DateInput(attrs={"class":"form-control", "type":"date"}),
            "date_end": forms.DateInput(attrs={"class":"form-control", "type":"date"})
        }

class Form_Working (forms.ModelForm):
    name_object = forms.ModelChoiceField(queryset=CreateNewGPR.objects.none())


    class Meta:
        model = CreateNewWorkDay
        fields = "second_name_working", "third_name_working", "value_work_fact", "lyudi_fact", "technik_fact", "date_day"
        widgets = {
            "date_day": forms.DateInput(attrs={"class":"form-control", "type":"date"})
        }

    def __init__(self, *args, **kwargs):
        name_working_instance = kwargs.pop('name_working_instance', None)  # Get name_working_instance from kwargs
        super().__init__(*args, **kwargs)
        if name_working_instance:
            self.fields['name_object'].queryset = CreateNewGPR.objects.filter(name_working=name_working_instance)   

class FilterForm(forms.Form):
    name = forms.CharField()

views.py

def create_book(request):
    if request.method == 'POST':
        form = Form_GPR(request.POST)
        if form.is_valid():
            # Process the form data
            form.save()
    else:
        name_object_instance = Genre.objects.get(name_object_instance='You Name')  # Example: Get instance
        form = Form_GPR(name_working_instance=name_working_instance)

You need to approach this differently - you should consider updating your models with inheritance. See multi-table inheritance.

This would look like:

class CreateNewGPR (models.Model):
    name_object = models.IntegerField(verbose_name="Наименование объекта")
    name_working = models.CharField(verbose_name="Наименование работы")
    type_izm = models.CharField(choices=TYPE_IZMERENIYA, verbose_name="Единицы измерения")
    value_work = models.FloatField(verbose_name="Объём работ")
    lyudi_norma = models.IntegerField(verbose_name="Нормативные затраты персонала")
    technik_norma = models.IntegerField(verbose_name="Нормативные затраты техники")
    date_begin = models.DateField(verbose_name="Дата начала работ")
    date_end = models.DateField(verbose_name="Дата окончания работ")


class CreateNewWorkDay (CreateNewGPR):  # <---
    second_name_working = models.CharField(verbose_name="Фактическое наименование работы")
    third_name_working = models.TextField(verbose_name="Описание работы")
    value_work_fact = models.FloatField(verbose_name="Объём работ фактический")
    lyudi_fact = models.IntegerField(verbose_name="Фактические затраты персонала")
    technik_fact = models.IntegerField(verbose_name="Фактические затраты техники")
    date_day = models.DateField(verbose_name="Дата")

Then, when you use a ModelForm for CreteNewWorkDay, Django will automatically create an accompanying CreateNewGPR object for every CreateNewWorkDay object.


Alternatively, you may want to use a OneToOneField for CreateNewWorkDay that points to an instance of CreateNewGPR - this makes both models separate (not parent/child) but links them with a ForeignKey.

Вернуться на верх