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
)