Django фильтрует объекты полей формы по существующей связи "один-к-одному

Я новичок в django и все еще пытаюсь разобраться в базовых вещах. У меня есть три модели: pc, pcslot и card. pcslot содержит отношения к слотам и к pc. Один pc может иметь несколько слотов, каждая карта может быть только в одном слоте.

class pcslot(models.Model):
    card = models.OneToOneField("card
        on_delete=models.SET_NULL,
        null=True,
        blank=True
    )
    computer = models.ForeignKey('pc',
        on_delete=models.CASCADE, 
        related_name='slots',
        editable=False
    )

Теперь я хочу исключить все уже назначенные карточки из выпадающего списка формы. Я попытался отфильтровать объекты внутри формы, добавив в модель

следующее
def get_related(self):
   if(hasattr(self, 'pcslot')):
       return 1
   return None

Но объектный фильтр django не может получить доступ к этим методам, поэтому filter(get_related=1) не работает:

class pcslotForm(ModelForm): class Meta: модель = pcslot fields = "all" def init(self, user=None, **kwargs): super(pcslotForm, self).init(**kwargs) self.fields['card'].queryset = card.objects.filter(get_related=1)

Каким образом лучше всего это сделать? Нужно ли перебирать все объекты и сравнивать или есть встроенный метод, о котором я еще не знаю? Спасибо

Теперь я хочу исключить все уже назначенные карты из выпадающего списка формы.

Я предполагаю, что из этого вы хотите получить набор всех карт, которые не находятся на дальней стороне отношения pcslot.card. Если это так, то вы можете просто использовать реляционное поле в своем фильтре. Итак

cards_without_assigned_slots = card.objects.filter(pcslot__isnull=True)

Обратите внимание, что в питоне более правильно называть классы в CamelCase (так Card вместо card)

Вернуться на верх