[英]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.