繁体   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