如何在Django中循环遍历另一个模型创建新数据库表
我有一个热电偶模型,现在我想为每个创建的热电偶记录温度,并把这些记录保存到数据库里。
编号 | 名称 |
---|---|
1 | thermocouple_1 |
2 | thermocouple_2 |
3 | thermocouple_3 |
然后,温度记录应该是这样的:
编号 | 日期 | 时间 | 用户 | thermocouple_1 | thermocouple_2 | thermocouple_3 |
---|---|---|---|---|---|---|
1 | 2024年3月5日 | 下午2:48 | 1 | 温度值_1 | 温度值_2 | 温度值_3 |
2 | 2024年3月5日 | 下午2:52 | 2 | 温度值_1 | 温度值_2 | 温度值_3 |
3 | 2024年3月5日 | 下午2:55 | 1 | 温度值_1 | 温度值_2 | 温度值_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),里面包含编号、用户、日期、时间和热电偶的相关数据。如果创建了10个热电偶,就需要10列来记录每个热电偶的温度(整数类型)。
我试过用以下代码,但没有成功。
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))
1 个回答
0
在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)