首页 > 解决方案 > 如何在 Django 中创建具有相同模型的多对多关系并保存到数据库?

问题描述

我有一个表单,它正在收集有关要创建的变量的数据。我想创建一个数据库中已经存在的变量列表。我通过创建多对多关系来做到这一点。当我启动服务器时,变量列表保存在应用程序中,但它不会更改名为选择性列表的数据库字段。

表格.py

class VariableForm(ModelForm):
    class Meta:
        model = variable
        fields = ['name', 'area', 'parameterName', 'order', 'type', 'format', 'units', 'comboItems',
                  'hiAlarm', 'loAlarm', 'scaleHiMax', 'scaleLoMax', 'deviationAlarm','selectiveList', 'round',
                  'days', 'required',  'hidden', 'readOnly', 'holdLast', 'calibrationFrequency',
                  'dateNextCalibration', 'triggerCalibrated']
        widgets = {
            'comboItems': forms.Textarea(attrs={'rows':1, 'cols': 40, 'style': 'height: 2em;padding-top:0'}),
            'forceValue': forms.Textarea(attrs={'rows':1, 'cols': 40, 'style': 'height: 2em;padding-top:0',
                                                'placeholder':'This will force all input to this variable'})
        }
        #selectiveList = forms.ModelMultipleChoiceField(queryset=variable.objects.all().order_by('-name').reverse())

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(VariableForm, self).__init__(*args, **kwargs)
        self.fields['round'] = forms.ModelMultipleChoiceField(
            queryset=opRound.objects.all(),
            widget=forms.SelectMultiple,
            label='Rounds',
            required=False
        )
        self.fields['selectiveList'] = forms.ModelMultipleChoiceField(
            queryset=variable.objects.all().order_by('-name').reverse(),
            widget=forms.SelectMultiple,
            label='Select Variables',
            required=False
        )
        self.fields['days'] = forms.ModelMultipleChoiceField(
            queryset=dayOfWeek.objects.all(),
            widget=forms.SelectMultiple,
            label='Days',
            required=False
        )
        self.fields['area'].choices = AreaIterator(request = self.request)
        try:
            self.fields['order'].initial = variable.objects.latest().order+1
        except Exception,e:
            print e

模型.py

class variable(models.Model):
    name = models.CharField(max_length=255)
    area = models.ForeignKey(area)#parent
    order = models.IntegerField("Order Index (0 is first, 1 is next, etc.)",default=999)#order index to display in order correctly, ascending
    type = models.CharField(max_length=255, choices=(("Value", "Value"), ("Runtime", "Runtime/FlowTotal"),
                                     ("Message", "Message"), ("CheckBox", "Check Box List"), ("Selection", "Selection Box"), ("Formula2", "Formula with other Variables"),
                                     ("OnOff", "In/Out of Service Selection"), ("OnOffSelection", "Selective On/Off")),
                            default = "Value" )#what type of variable
    format = models.CharField(max_length=255,choices=(("Number", "Number (Without Decimals)"),
                                                      ("2Number", "Number (With Decimals)"), ("Date", "Date"),
                                                      ("Time", "Time"), ("Text", "Text")), blank=True, null=True, default="2Number" )#number format if needed
    units = models.CharField(max_length=255,blank=True,null=True)#units of measurement
    required = models.BooleanField(default=True)#is the variable required in a round
    hiAlarm = models.FloatField("High Alarm",blank=True,null=True)#red notify if above
    loAlarm = models.FloatField("Low Alarm",blank=True,null=True)#yellow notify if below
    scaleHiMax = models.FloatField("Limit maximum value",blank=True,null=True)#scale to high max if needed
    scaleLoMax = models.FloatField("Limit low value",blank=True,null=True)#scale to low if needed
    deviationAlarm = models.FloatField("Deviation Alarm",blank=True,null=True,
                                       help_text="Triggers an alarm if the value between this record and the last is greater than this percentage.")#%change check
    round = models.ManyToManyField(opRound,blank=True)#round of gathering data
    days = models.ManyToManyField(dayOfWeek,blank=True)#day of the week
    selectiveList = models.ManyToManyField("self",through="variable",blank=True,symmetrical=False)#List to determine which variables to display when the selection is "OFF"
    parameterName = models.CharField("Parameter Name (ReportID)",max_length=255,blank=True,null=True)#hachWIM ID
    comboItems = models.TextField("List of comma separated options.", blank=True,null=True)#list deliminated by a column for choosing
            #PUT EQUATION HERE
    hidden = models.BooleanField("Sync to tablet",default=True)#this muse be True if required is true
    readOnly = models.BooleanField("Read only.", default = False)
    dateTimeEdited = models.DateTimeField(auto_now=True)#date edited
    userEdited = models.ForeignKey(CustomUser,blank=True,null=True,related_name="userEditedV")# last user to edit data
    forceValue = models.TextField(blank=True,null=True)#force reading
    userForced = models.ForeignKey(CustomUser,blank=True,null=True,related_name="userForcedV")# last user to force data
    useForce = models.BooleanField("Turn Forcing On", default=False)
    dateNextCalibration = models.DateField("Next Calibration Date", blank=True,null=True, help_text="YYYY-MM-DD")
    triggerCalibrated = models.BooleanField("Trigger next calibration date", default=False)
    calibrationFrequency = models.ForeignKey(calibrationFrequency, blank=True, null=True)
    version = models.BigIntegerField(default=1)#used for sync
    holdLast = models.BooleanField("Selecting this will hold the last value on the tablet automatically.", default=False)

当我们尝试从不同的模型(例如圆形或天数)中执行此操作时,它会使用这些关系创建一个新的数据库表。我想将选定的值作为字符串列表存储在同一模型的选择性列表列中。

这是多选的样子。

标签: pythondjangomodelmany-to-many

解决方案


推荐阅读