[英]django how to have multiple foreignkey from the same model
這是我的模型:
class Item(models.Model):
name = models.CharField(max_length=30)
...
choices = (
('weapon', 'weapon'),
('shield', 'shield'),
)
typeOf = models.CharField(max_length=15, choices=choices)
class Character(models.Model):
name = models.CharField(max_length=30, unique=True)
...
weapon = models.ForeignKey(Inventory) // **THIS IS WHAT I WANT TO DE BUT DOES'NT WORK**
shield = models.ForeignKey(Inventory) // **THIS IS WHAT I WANT TO DE BUT DOES'NT WORK**
inventory = models.ManyToManyField(Item, through='Inventory')
class Inventory(models.Model):
character = models.ForeignKey('Character')
item = models.ForeignKey('Item')
我知道如何將物品添加到庫存中,但現在我想裝備它們。 我如何做外鍵? 我希望能夠從我的庫存中裝備武器
您需要將related_name
添加到字段定義中
...
weapon = models.ForeignKey(Inventory, related_name='weapons')
shield = models.ForeignKey(Inventory, related_name='shields')
...
如果沒有related_name
,django 將嘗試在Inventory
模型中創建character_set
屬性,但第二次會失敗。
如果你確實想做到這一點,你需要一個related_name
每個FK,作為錯誤信息就會明確。 但是,您不想這樣做,因為它沒有任何意義。
您不想同時擁有 Item 的多對多關系和特定的 Inventory 關系。 您需要其中之一。 一個角色是否可以擁有比單一武器和盾牌更多的庫存物品? 如果不是,則放棄多對多; 但是 ForeignKeys 應該直接指向 Item:
class Character(models.Model):
...
weapon = models.ForeignKey(Item, related_name="weapon_players")
shield = models.ForeignKey(Item, related_name="shield_players")
否則,您應該刪除兩個外鍵並只使用多對多。 您可以向 Character 模型添加方法或屬性以獲取作為武器或盾牌的庫存物品。 此外,由於您沒有在直通表上做任何額外的事情,您可以將其刪除; Django 會自動提供一個。
class Character(models.Model):
...
inventory = models.ManyToManyField(Item)
@property
def shield(self):
return self.inventory.filter(typeOf='shield').first()
@property
def shield(self):
return self.inventory.filter(typeOf='weapon').first()
這是一個老問題,但我想補充一些我今天學到的可能會有所幫助的內容:
https://pypi.python.org/pypi/django-composite-foreignkey http://django-composite-foreignkey.readthedocs.io/en/latest/quickstart.html
在創建多個外鍵之前,您必須通過在元數據中添加 unique_togther 屬性來聲明復合主鍵。 按照提供的指南,您可以在 django 項目中將多個列聲明為外鍵
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.