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'?
Спасибо, что дочитали до конца, и я ценю вашу помощь здесь.