Отношение один ко многим или много ко многим в DJANGO - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу попытаться построить отношения между работником и территорией. Каждый сотрудник должен посетить более одного района, и этот район зависит от города. Я построил отношения между городом и областью с иностранным ключом (многие-к-одному). Я должен добавить больше чем одну область к одному сотруднику, однако я использовал много отношений между сотрудником и областью. На момент регистрации сотрудника, когда я выбираю город из выпадающего списка «Город», список области не изменяется. Все области показаны. Это моя форма сотрудника

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

, если я вступил в неправильные отношения, тогда, пожалуйста, направьте меня.

...