Моя модель Джанго выглядит так:
class Entity(models.Model):
name = models.CharField(max_length=40)
examples = models.ManyToManyField(Example, blank=True)
tokens = models.ManyToManyField(Token, blank=True, null=True)
Я хочу обеспечить уникальность среди токенов, т. Е. Если уже есть сущность с токенами ['a', 'b', 'c'], я не хочу добавлять еще одну с помощью ['a', 'b ',' c ']. Однако сущность с токенами ['a', 'b', 'c', 'd'] или ['a', 'b'] является другим набором и должна быть добавлена.
В случае, когда сущность с определенным набором уже найдена, я хочу добавить новые примеры, которые были обнаружены к этому ManyToMany. Старое имя может остаться.
В настоящее время я запускаю запрос, чтобы получить существующую сущность с точным набором токенов (это само по себе является проблемой в django), а затем, если он найден, я обновляю его новым примером. Проблема заключается в том, что это выполняется в нескольких процессах на нескольких серверах, поэтому существует условие состязания между проверкой, существует ли соответствующий объект, и созданием нового, если он не был найден. Это может привести к созданию сущностей с дублирующимися наборами токенов.
Одно решение, которое я придумала, - это использовать явную сквозную модель для ManyToMany и переопределить метод сохранения для сквозной модели, чтобы создать хэш набора токенов и включить его в саму сквозную модель в столбце с уникальное ограничение. Я думаю, что это сработает, но это не выглядит особенно элегантным решением.
Я бы также предположил, что эта проблема в какой-то степени распространена в среде SQL с таблицами сопоставления в случае, когда вам нужен уникальный набор - возможно, здесь есть хорошо известное решение? Я, конечно, открыт для использования raw sql.
Заранее спасибо за помощь!