DJANGO中的一对多或多对多关系

时间:2020-04-24 08:45:10

标签: django django-models django-forms

我想尝试在员工和区域之间建立关系。每个员工必须访问多个区域,并且该区域取决于城市。我使用外键(多对一)在城市和区域之间建立了关系。我必须为单个员工添加多个区域,但是,我使用了员工与区域之间的许多关系。在员工注册时,当我从“城市”下拉列表中选择城市时,区域列表未更改。显示所有区域。 这是我的员工表格

class EmployeeForm(forms.ModelForm):
    class Meta():
        model =Employee
        fields = ('code','first_name','last_name','designation','report_to','join_date','leave_date','city','area','username','password','status','address')
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['area'].queryset = Area.objects.none()

            if 'city' in self.data:
                try:
                    city_id = int(self.data.get('city'))
                    self.fields['area'].queryset = Area.objects.filter(city_id=city_id).order_by('name')
                except (ValueError, TypeError):
                    pass  # invalid input from the client; ignore and fallback to empty City queryset
            elif self.instance.pk:
                self.fields['area'].queryset = self.instance.city.area_set.order_by('name')

模型是

class Employee(models.Model):
    code = models.CharField(max_length = 256)
    # name = models.CharField(max_length = 256)
    designation =models.ForeignKey(Designation,on_delete=models.CASCADE)
    report_to = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE)
    area = models.ManyToManyField(Area, through ='EmployeeArea',)
    city = models.ForeignKey(City, on_delete=models.CASCADE, null=True, blank=True,)
    status = models.BooleanField(default = True)
    join_date = models.DateField(default=datetime.datetime.now)
    leave_date = models.DateField(blank = True, null=True)
    username = models.CharField(max_length = 256)
    password = models.CharField(max_length = 256)
    first_name = models.CharField(max_length = 256)
    last_name = models.CharField(max_length = 256)

class City(models.Model):
    name = models.CharField(max_length=256)
    def __str__(self):
        return self.name

class Area(models.Model):
    name = models.CharField(max_length=256)
    city = models.ForeignKey(City, on_delete=models.CASCADE)
    def __str__(self):
        return self.name

如果我建立了错误的恋爱关系,请引导我。

0 个答案:

没有答案
相关问题