Django Rest Framework - Способ сделать определенные значения в двух столбцах родительской таблицы ограничением, которое будет использоваться только вместе в дочерней таблице как fk?

Не уверен, что правильно сформулировал свой вопрос в заголовке, попробую объяснить лучше ниже...

Допустим, родительская таблица под названием Share имеет два столбца: ShareCode Charfield (первичный ключ) и ShareName unique Charfield (строка). Это означает, что у нас будет уникальный ShareCode и ShareName в каждой строке этой таблицы. Код для этого приведен ниже.

class Share(models.Model):
    ShareCode = models.CharField(max_length=100, primary_key=True, default="N/A")
    ShareName = models.CharField(max_length=100, unique=True, default="N/A")

Допустим, у нас есть дочерняя таблица Fund. Эта таблица будет состоять из автополя FundID (первичный ключ), поля FundCode Charfield и поля FundName CharField. Она также будет иметь два внешних ключа, которые ссылаются на таблицу Share, ShareCode и Sharename. Наконец, у него будет два ограничения unique_together, FundCode и ShareCode в качестве первого ограничения, и FundCode и ShareName в качестве второго. Код ниже.

class Fund(models.Model):
    FundID = models.AutoField(primary_key=True)
    FundCode = models.CharField(max_length=100, default="N/A")
    FundName = models.CharField(max_length=100, default="N/A")
    ShareCode = models.ForeignKey(Share, to_field='ShareCode', related_name='fundsShareCode',
                                  on_delete=models.CASCADE)
    ShareName = models.ForeignKey(Share, to_field='ShareName', related_name='fundsShareName',
                                  on_delete=models.CASCADE)

    class Meta:  
        unique_together = ('FundCode', 'ShareCode'),
        unique_together = ('FundCode', 'ShareName')

Представьте, что все акции, которые нам могут понадобиться, уже находятся в таблице Share. Однако данные таблицы Fund вводятся кем-то вручную перед добавлением в базу данных. Поэтому столбец ShareName fk был добавлен в таблицу Fund, чтобы облегчить ее интерпретацию, даже если столбцы ShareCode и FundCode были бы достаточны для функциональности сами по себе.

Однако теперь возникает проблема. Допустим, человек, вводящий данные в эту таблицу, добавляет несколько акций в определенный фонд. Таким образом, код фонда 'FND123ABC' распространяется на 3 строки, а коды акций 'SHR1', 'SHR2' и 'SHR3' являются второй половиной первого ограничения unique_together для этих 3 строк.

Однако они также должны удовлетворять другому ограничению. 'FND123ABC' уже предусмотрено для второго ограничения, но вторая половина, ShareName, вводится пользователем. Три акции, которые вводятся, - это 'AbcCompany' (назначенная SHR1 в таблице Share), 'DefCompany' (назначенная SHR2 в таблице Share) и 'EfgCompany' (назначенная SHR3 в таблице Share). Пользователь вводит в таблицу Fund для этого второго ограничения следующее (представьте, что приведенный ниже ввод является правильным синтаксисом):

Строка 1...

FundCode: "FND123ABC",
ShareCode: "SHR1",
ShareName: "AbcCompany"

Строка 2...

FundCode: "FND123ABC",
ShareCode: "SHR3"
ShareName: "DefCompany"

Строка 3...

FundCode: "FND123ABC",
ShareCode: "SHR2"
ShareName: "EfgCompany"

Если посмотреть на приведенные выше данные, то в строке 1 все в порядке. ShareCode 'SHR1' сопоставлен с ShareName 'AbcCompany' в таблице Share, поэтому здесь нет ничего неправильного или противоречивого. А вот со строками 2 и 3 возникли проблемы. В строке 2 ShareCode 'SHR3' присвоен ShareName 'DefCompany', тогда как в таблице Share 'SHR3' связан с ShareName 'EfgCompany'. В последней строке та же проблема: 'SHR2' присвоен 'EfgCompany', тогда как в таблице Share 'SHR2' ассоциирован с 'DefCompany'.

Итак, учитывая эту информацию, есть ли способ предотвратить случайное совершение пользователем подобной ошибки? Удаление поля ShareName в таблице Fund - это один из вариантов, но я хочу оставить его там, чтобы таблица Fund была намного проще для чтения, а не трудночитаемый набор кодов фондов и акций. Итак, если мы оставим его, есть ли способ, ограничение или что-то еще, что может гарантировать, что если, например, используется ShareCode 'SH2', то он ДОЛЖЕН быть сопряжен с полем, связанным с ним в таблице Share, 'DefCompany'?

Спасибо, что дочитали до конца, и я ценю вашу помощь здесь.

Вернуться на верх