簡體   English   中英

django 如何從同一模型中獲得多個外鍵

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

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