Django несколько внешних ключей для одной таблицы - PullRequest
2 голосов
/ 07 августа 2020

Мне нужно записать транзакцию движения товара на складе. У меня есть 3 таблицы, как показано на изображении ниже. Однако Django ошибка ответа:

ОШИБКИ: chemstore.ItemTransaction: (models.E007) Поле 'outbin' имеет имя столбца 'bin_code_id', которое используется другим полем.

, которое жалуется многократного использования одного и того же внешнего ключа. У меня проблема с дизайном стола? или это не разрешено под Django? Как я могу этого добиться с помощью Django? thankyou

Дизайн БД

[Модели]

class BinLocation(models.Model):
    bin_code = models.CharField(max_length=10, unique=True)
    desc = models.CharField(max_length=50)

    def __str__(self):
        return f"{self.bin_code}"

    class Meta:
        indexes = [models.Index(fields=['bin_code'])]


class ItemMaster(models.Model):
    item_code = models.CharField(max_length=20, unique=True)
    desc = models.CharField(max_length=50)
    long_desc = models.CharField(max_length=150, blank=True)
    helper_qty = models.DecimalField(max_digits=10, decimal_places=4)
    unit = models.CharField(max_length=10, blank=False)

    def __str__(self):
        return f"{self.item_code}"

    class Meta:
        verbose_name = "Item"
        verbose_name_plural = "Items"
        indexes = [models.Index(fields=['item_code'])]


class ItemTransaction(models.Model):
    trace_code = models.CharField(max_length=20, unique=False)
    item_code = models.ForeignKey(
        ItemMaster, related_name='trans', on_delete=models.CASCADE, null=False)
    datetime = models.DateTimeField(auto_now=False, auto_now_add=False)
    qty = models.DecimalField(max_digits=10, decimal_places=4)
    unit = models.CharField(max_length=10, blank=False)
    action = models.CharField(
        max_length=1, choices=ACTION, blank=False, null=False)
    in_bin = models.ForeignKey(
        BinLocation, related_name='in_logs', db_column='bin_code_id', on_delete=models.CASCADE, null=False)
    out_bin = models.ForeignKey(
        BinLocation, related_name='out_logs', db_column='bin_code_id', on_delete=models.CASCADE, null=False)
    remarks = models.TextField(blank=True)

    def __str__(self):
        return f"{self.trace_code} {self.datetime} {self.item_code} {dict(ACTION)[self.action]} {self.qty} {self.unit} {self.in_bin} {self.out_bin}"

Ответы [ 3 ]

2 голосов
/ 07 августа 2020

у вас одинаковый db_column в двух полях, измените его

    in_bin = models.ForeignKey(
        BinLocation, related_name='in_logs', db_column='bin_code_id', on_delete=models.CASCADE, null=False)
    out_bin = models.ForeignKey(
        BinLocation, related_name='out_logs', db_column='other_bin_code', on_delete=models.CASCADE, null=False) /*change db_column whatever you want but it should be unique*/
1 голос
/ 07 августа 2020

Если они связаны с одним и тем же названием модели, вы должны использовать разные связанные_имя для каждого поля foreign_key. вот пример:

    address1 = models.ForeignKey(Address, verbose_name=_("Address1"),related_name="Address1", null=True, blank=True,on_delete=models.SET_NULL)

    address2 = models.ForeignKey(Address, verbose_name=_("Address2"),related_name="Address2", null=True, blank=True,on_delete=models.SET_NULL)
0 голосов
/ 10 августа 2020

спасибо за помощь всем. По словам Алексея и Табаане, это проблема с моей БД (нарушение правила РСУБД), а не с Django. Я поискал в Интернете и нашел что-то похожее: Шаблон проектирования БД ОДИН К МНОГИМ

В моем случае я должен хранить в корзине и выходе как отдельные транзакции, а не входить и выходить в разовая транзакция. Это мое решение. thankyou.

ps Альтернативное решение: я сохраняю в корзине и вне корзины как одну транзакцию, но я не использую внешний ключ для корзин, запрашиваю как в корзине, так и вне корзины для выбора корзины клиентским приложением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...