Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django如何从同一模型中获得多个foreignkey_Python_Django_Model_Foreign Keys - Fatal编程技术网

Python django如何从同一模型中获得多个foreignkey

Python django如何从同一模型中获得多个foreignkey,python,django,model,foreign-keys,Python,Django,Model,Foreign Keys,这是我的模型: 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(mo

这是我的模型:

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')
我知道如何添加项目的库存,但现在我想装备他们。我如何使用外键?
我希望能够从我的库存装备武器

您需要在字段定义中添加
相关名称

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

如果没有
相关的\u名称
,django将尝试在
库存
模型中创建
字符集
属性,但第二个属性将失败。

如果您确实想这样做,您将需要在每个FK上使用
相关的\u名称
,正如错误消息所表明的那样。但是,您不想这样做,因为这毫无意义

您不希望同时具有物料的多对多关系和特定的库存关系。你需要一个或另一个。一个角色可以拥有比一件武器和盾牌更多的库存物品吗?如果没有,那就放弃多对多;但外键应直接指向项目:

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

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

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