Вы упоминаетесь в вашем вопросе как " К сожалению, Django ORM не поддерживает более чем один столбец внешних ключей ".
Да, Django не предоставлять такой тип поддержки, потому что Django имеет более надежный, чем мы думаем:)
Итак, Django предоставляют одну мета-опцию для преодоления этого типа проблемы, и эта опция unique_together
.
Вы можете предоставить Наборы имен полей, которые, взятые вместе, должны быть уникальными, в вашем случае ...
class CommonModel(models.Model):
# Auto-generated by Django, but included in this example for clarity.
# id = models.AutoField(auto_created=True, primary_key=True,
serialize=False, verbose_name='ID')
ORIGIN_SOURCEA = '1'
ORIGIN_SOURCEB = '2'
ORIGIN_CHOICES = [
(ORIGIN_SOURCEA, 'Source A'),
(ORIGIN_SOURCEB, 'Source B'),
]
object_origin = models.IntegerField(choices=ORIGIN_CHOICES)
object_id = models.IntegerField()
class meta:
unique_together = [['object_origin', 'object_id']]
Вы можете предоставить список списков, наборов наборов или простой список, простой установить unique_together
вариант class meta:
.
Да, но Django сказал, что ...
UniqueConstraint предоставляет больше функциональности, чем unique_together.
unique_together может быть устаревшим в будущем.
Вы можете добавить UniqueConstraint
вместо unique_together
в том же class meta:
, в вашем случае вы можете написать, как показано ниже ...
class CommonModel(models.Model):
# Auto-generated by Django, but included in this example for clarity.
# id = models.AutoField(auto_created=True, primary_key=True,
serialize=False, verbose_name='ID')
ORIGIN_SOURCEA = '1'
ORIGIN_SOURCEB = '2'
ORIGIN_CHOICES = [
(ORIGIN_SOURCEA, 'Source A'),
(ORIGIN_SOURCEB, 'Source B'),
]
object_origin = models.IntegerField(choices=ORIGIN_CHOICES)
object_id = models.IntegerField()
class meta:
constraints = [ models.UniqueConstraint(fields=['object_origin', 'object_id'], name='unique_object')]
Таким образом, рекомендуется использовать параметр constraints
вместо unique_together
из class meta:
.