簡體   English   中英

Django 多個外鍵指向同一張表

[英]Django multiple foreign key to a same table

我需要在倉庫中記錄物品移動的交易。 我有 3 個表,如下圖所示。 然而 Django 響應錯誤:

錯誤:chemstore.ItemTransaction:(models.E007)字段“outbin”的列名“bin_code_id”被另一個字段使用。

這是抱怨多次使用同一個外鍵。 我的桌子設計有問題嗎? 還是在 Django 下不允許? 如何在 Django 下實現這一點? 謝謝你

數據庫設計

[楷模]

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}"

你在兩個字段中有相同的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*/

如果鏈接到相同的 model 名稱,您應該為每個foreign_key 字段使用不同的related_name。 這是一個例子:

    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)

謝謝大家的幫助。 根據 Aleksei 和 Tabaane 的說法,這是我的數據庫設計問題(違反了 RDBMS 規則),而不是 Django 問題。 我在網上搜索,發現類似的東西: ONE-TO-MANY DB design pattern

就我而言,我應該將 bin 和 out bin 存儲為單獨的事務,而不是在單個事務中同時存儲 in 和 out。 這是我的解決方案。 謝謝你。

ps 替代解決方案:我將 bin 和 out bin 保留為單個事務,但我不使用 bin 的外鍵,同時查詢 in bin 和 out bin 以獲取客戶端應用程序的 bin 選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM