Как использовать.правильно фильтруйте в Django, и код, похоже, не выполняется

#python #django #django-filter

Вопрос:

Я пытаюсь сопоставить позиции из одной таблицы в другую, но на данный момент я действительно не понимаю, как использовать .filter.

У меня есть такой рабочий класс, как этот,

 class Worker(models.Model):
    """Model representing a worker."""
    personal_id = models.IntegerField(primary_key=True, help_text='Unique ID for a worker in the 

whole company')
        position = models.ForeignKey(Position, on_delete=models.SET_NULL, null=True)
        Machine_of_Worker = models.ManyToManyField('Machine', blank=True, related_name = 'workers')
               
""" insert filtering method here """
        
        class Meta:
        ordering = ['personal_id']
    
    def __str__(self):
        """String for representing the Model object."""
        return f'{self.last_name}, {self.first_name}'
    
    def get_absolute_url(self):
        """Returns the url to access a detail record for this book."""
        return reverse('worker-detail', args=[str(self.personal_id)])
 

класс машин, подобный этому

 > class Machine(models.Model):    
>         """Model representing a Machine."""
>         machine_id = models.IntegerField(primary_key=True, help_text="enter machine number as unique id here")
>         Worker_On_Machine = models.ManyToManyField(Worker, blank=True, related_name = 'machines')
>         position = models.ForeignKey(Position, on_delete=models.SET_NULL, blank=True, null=True)
 

и класс должностей в соответствии с этим.

 class Position(models.Model):
    """ Model representation of the positions and ground states """
    square_id = models.IntegerField(primary_key=True, help_text='Unique ID for a position square in x/y coordinate in the whole company')
    x_pos = models.IntegerField(default = 0, help_text="enter x coordinate here")
    y_pos = models.IntegerField(default = 0, help_text="enter y coordinate here")
 

Мой рабочий администратор выглядит так

 class WorkerAdmin(admin.ModelAdmin):
    readonly_fields = ['worker_on_machine']
    list_display = ('position')
    fields = ['personal_id', 'Machine_of_Worker', ('position','worker_on_machine')]
 
 

Теперь я хочу использовать метод фильтрации для сопоставления machine_id всех доступных машин в Machine_of_Worker соответствии с положением, в котором находится работник в данный момент. Поэтому я попробовал следующее на первом шаге, этот метод находится в моем class Worker . Это actual_position печатается правильно, когда я обращаюсь к работнику. Но остальная часть кода, похоже, не выполняется. print(machine_position) не отображается в консоли. Нет никаких сообщений об ошибках или чего-либо еще.

 @property
def MapMachinePosition(self):
    MachineID = ''
    actual_position = self.position.square_id
    print(actual_position)
    machine_position = self.object.filter(Machine_of_Worker__position__square_id = self.position.square_id)
    print(machine_position)
    
    if machine_position.exists():
        for event in machine_position:
            if (event.position.square_id == actual_position):
                MachineID = event.position.square_id    
        
    return MachineID
worker_on_machine= MapMachinePosition
 

Может быть, вы поможете мне выяснить, почему код не выполняется и верен ли он.

Если вам нужна дополнительная информация, пожалуйста, прокомментируйте. Спасибо

Комментарии:

1. Я обнаружил, что фильтрация пошла не так. Правильно это machine_position = Machine.objects.filter(position__square_id = self.position.square_id) . Но я не понимаю, почему в нем не было ни сообщения об ошибке, ни возвращаемого значения machine_position .