【问题标题】:django how to have multiple foreignkey from the same modeldjango如何从同一个模型中获得多个外键
【发布时间】:2015-03-28 10:12:15
【问题描述】:

这是我的模型:

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')

我知道如何将物品添加到库存中,但现在我想装备它们。我如何做外键? 我希望能够从我的库存中装备武器

【问题讨论】:

标签: python django model foreign-keys


【解决方案1】:

您需要在字段定义中添加related_name

...
weapon = models.ForeignKey(Inventory, related_name='weapons') 
shield = models.ForeignKey(Inventory, related_name='shields')
...

没有related_name,django 将尝试在Inventory 模型中创建character_set 属性,但第二次失败。

【讨论】:

    【解决方案2】:

    如果您确实想这样做,则需要在每个 FK 上都有一个 related_name,因为错误消息会很清楚。但是,您不想这样做,因为它没有任何意义。

    您不想同时拥有 Item 的多对多关系和特定的 Inventory 关系。你需要一个或另一个。一个角色可以拥有比单一武器和盾牌更多的库存物品吗?如果不是,则丢弃多对多;但是 ForeignKeys 应该直接指向 Item:

    class Character(models.Model):
        ...
        weapon = models.ForeignKey(Item, related_name="weapon_players")
        shield = models.ForeignKey(Item, related_name="shield_players")
    

    否则,您应该删除两个外键并只使用多对多。您可以向角色模型添加方法或属性,以获取作为武器或盾牌的库存项目。此外,由于您没有在直通表上做任何额外的事情,您可以将其移除; 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()
    

    【讨论】:

      【解决方案3】:

      这是一个老问题,但我想补充一些我今天学到的可能对你有帮助的东西:

      https://pypi.python.org/pypi/django-composite-foreignkey http://django-composite-foreignkey.readthedocs.io/en/latest/quickstart.html

      在创建多个外键之前,您必须通过在 meta.xml 中添加 unique_togther 属性来声明复合主键。按照提供的指南,您可以在 django 项目中将多个列声明为外键

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-01
        • 2021-04-01
        • 2010-10-07
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        相关资源
        最近更新 更多