Как связать модель через ForeignKey но только с определенными объектами таблицы?

Для связывания модели через ForeignKey только с определенными объектами таблицы в Django можно использовать параметр limit_choices_to.

Параметр limit_choices_to позволяет ограничить список выбора объектов-связей при создании поля ForeignKey. Он принимает словарь, в котором можно указать условия для выбора объектов.

Допустим, у вас есть две модели Model1 и Model2, и вы хотите установить ForeignKey из Model2 на Model1, но связываться только с определенными объектами Model1 по условию.

Например, предположим, что у Model1 есть поле status с выбором "active" и "inactive", а вы хотите, чтобы ForeignKey в Model2 связывался только с активными объектами Model1. Для этого вы можете использовать параметр limit_choices_to следующим образом:

from django.db import models

class Model1(models.Model):
    STATUS_CHOICES = (
        ('active', 'Active'),
        ('inactive', 'Inactive'),
    )
    status = models.CharField(max_length=10, choices=STATUS_CHOICES)

class Model2(models.Model):
    model1 = models.ForeignKey(Model1, on_delete=models.CASCADE,
                               limit_choices_to={'status': 'active'})

В результате, при создании объекта Model2 в админке Django или при использовании формы, будет отображаться только список активных объектов из Model1 при выборе связи через ForeignKey.

Нужно отметить, что limit_choices_to применяется только для отображения и выбора объектов связи, и он не накладывает ограничений на саму связь или сохранение объекта в базе данных. Если вы попытаетесь сохранить объект Model2 с связью с объектом Model1, не соответствующему указанным условиям в limit_choices_to, вам будет выдано исключение ValidationError. Если требуется дополнительная проверка, вы также можете использовать сигналы Django или переопределить метод clean() модели Model2 для дополнительной валидации.