Как создать новую таблицу базы данных в цикле через другую модель в Django

У меня есть модель термопары, и я хочу создать другую модель для записи температуры для каждой созданной термопары и сохранить ее в базе данных. for thermocouple

| Id | name |

| 1 | thermocouple_1 |

| 2 | термопара_2 |

| 3 | thermocouple_3 |

тогда TemperatureRecord должен быть таким

| id | date | time | user | thermocouple_1 | thermocouple_2 | thermocouple_3 |

| 1 | 5 марта 2024 | 2:48 pm. | 1 | Tempe_value_1 | Tempe_value_2 | Tempe_value_3 |

| 2 | 5 марта 2024 | 2:52 pm. | 2 | Tempe_value_1 | Tempe_value_2 | Tempe_value_3 |

| 3 | 5 марта 2024 | 2:55 вечера. | 1 | Tempe_value_1 | Tempe_value_2 | Tempe_value_3 |

Модель термопары

class Thermocouple(models.Model):
    name = models.CharField(max_length=50, unique=True, help_text="Name of the thermocouple")

    def __str__(self):
        return f"{self.name}"

    class Meta:
        ordering = ['id']

    @classmethod
    def bulk_create_from_import(cls, data):
        cls.objects.bulk_create([cls(**item) for item in data])

и я хочу создать другую модель таблицы базы данных с именем TemperatureRecord, состоящую из id, пользователя, даты, времени и элементов термопары. если создано 10 термопар, необходимо иметь 10 колонок для каждой термопары для записи температуры (IntegerField)

Я пробовал использовать следующий код, но ничего не вышло.

class TemperatureRecord(models.Model):
    date = models.DateField()
    time = models.TimeField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    
    def __init__(self, *args, **kwargs):
        super(TemperatureRecord, self).__init__(*args, **kwargs)
        temperatures = Thermocouple.objects.all()
        for thermocouple in temperatures:
            field_name = thermocouple.name.lower().replace(" ", "_")  # Creating field name from thermocouple temperature
            setattr(self, field_name, models.IntegerField(null=True, blank=True)) 

После применения следующего кода в файле models.py он заработал:

class TemperatureRecord(models.Model):
    user = models.ForeignKey(User, null=True, default='1', on_delete=models.SET_NULL)
    date = models.DateField(help_text="Date of the temperature record")
    time = models.TimeField(help_text="Time of the temperature record")

    class Meta:
        verbose_name = "Temperature Record"
        verbose_name_plural = "Temperature Records"

    def __str__(self):
        return f"{self.thermocouple.name} - {self.date} {self.time} - {self.temperature}°C"

    class Meta:
        ordering = ['id']

    @classmethod
    def bulk_create_from_import(cls, data):
        cls.objects.bulk_create([cls(**item) for item in data])

def create_temperature_field(name):
    return models.IntegerField(null=True, blank=True, verbose_name=name)

# Dynamically create fields for each thermocouple
thermocouples = Thermocouple.objects.all()
for thermocouple in thermocouples:
    field_name = thermocouple.name.lower().replace(" ", "_")
    TemperatureRecord.add_to_class(field_name, create_temperature_field(thermocouple.name))

admin.py

from django.contrib import admin
from .models import Thermocouple, TemperatureRecord

class TemperatureRecordAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        thermocouples = Thermocouple.objects.all()
        for thermocouple in thermocouples:
            field_name = thermocouple.name.lower().replace(" ", "_")
            form.base_fields[field_name] = forms.IntegerField(required=False)
        return form

    list_display = ['date', 'time', 'user']  # Add other fields as needed

admin.site.register(TemperatureRecord, TemperatureRecordAdmin)
Вернуться на верх