Как правильно применить комбинацию полей в другой таблице (Django)?

#django #django-models

#django #django-модели

Вопрос:

У меня есть Outcode модель, которая имеет отношение «один ко многим» с SubOutcode моделью:

 class Outcode(models.Model):
    outcode = models.CharField(max_length=4, primary_key=True)

    class Meta:
        managed = True
        db_table = 'outcode'
 

SubOutcode Модель:

 class SubOutcode(models.Model):
    outcode = models.ForeignKey('Outcode', models.DO_NOTHING)
    sub_outcode = models.CharField(max_length=4, default="")

    class Meta:
        managed = True
        constraints = [
            models.UniqueConstraint(fields=['outcode', 'sub_outcode'], name='unq_sub_outcode')
        ]
        db_table = 'sub_outcode'
 

Я хочу иметь возможность создавать Property записи, только если существует соответствующая комбинация полей SubOutcode . Как мне Property правильно настроить? Моя текущая настройка не работает так, как она выглядит, если Outcode и SubOutcode существуют отдельно, как показано ниже, но я хочу Property применить комбинацию, если это имеет смысл? Спасибо за вашу помощь.

 class Property(models.Model):     

    property_outcode = models.ForeignKey('Outcode', models.DO_NOTHING)
    property_sub_outcode = models.ForeignKey('SubOutcode', models.DO_NOTHING, to_field='sub_outcode')
 

Ответ №1:

В приведенном выше коде экземпляры SubOutcode могут существовать только в том случае, если у них есть ссылка на экземпляр Outcode. Это потому, что вы не установили null=True внешний ключ для вложенного кода.

Таким образом, вы могли бы просто удалить property_outcode в своей модели свойств, так как его вложенный код должен иметь внешний ключ, указывающий на экземпляр Outcode:

 class Property(models.Model):     
    property_sub_outcode = models.ForeignKey('SubOutcode', models.DO_NOTHING, to_field='sub_outcode')
 

Теперь ваши экземпляры свойств всегда будут существовать только в том случае, если его ссылка на вложенный код также имеет экземпляр Outcode.

Если у вас есть property_instance и вы хотите знать, на какой экземпляр Outcode ссылается его SubOutcode, используйте: property_instance.property_sub_outcode.outcode .