#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
.