我正在尝试寻找最有效的方法遍历我的模型,以获得我所需要的数据。我有三个“相关”模型。Item
、ProtectionList
和Player
保护列表
class ProtectionList(models.Model):
player = models.ForeignKey(Player)
main_hand = models.ForeignKey(Item, null=True, blank=True, related_name='main_hand')
off_hand = models.ForeignKey(Item, null=True, blank=True, related_name='off_hand')
head = models.ForeignKey(Item, null=True, blank=True, related_name='head')
neck = models.ForeignKey(Item, null=True, blank=True, related_name='neck')
shoulder = models.ForeignKey(Item, null=True, blank=True, related_name='shoulder')
back = models.ForeignKey(Item, null=True, blank=True, related_name='back')
chest = models.ForeignKey(Item, null=True, blank=True, related_name='chest')
wrist = models.ForeignKey(Item, null=True, blank=True, related_name='wrist')
hands = models.ForeignKey(Item, null=True, blank=True, related_name='hands')
waist = models.ForeignKey(Item, null=True, blank=True, related_name='waist')
legs = models.ForeignKey(Item, null=True, blank=True, related_name='legs')
feet = models.ForeignKey(Item, null=True, blank=True, related_name='feet')
ring1 = models.ForeignKey(Item, null=True, blank=True, related_name='ring1')
ring2 = models.ForeignKey(Item, null=True, blank=True, related_name='ring2')
trinket1 = models.ForeignKey(Item, null=True, blank=True, related_name='trinket1')
trinket2 = models.ForeignKey(Item, null=True, blank=True, related_name='trinket2')
locked = models.BooleanField(default=False)
def __unicode__(self):
return self.player.main_character.name
玩家
class Player(models.Model):
accountID = models.CharField(max_length=255, null=True, blank=True)
battletag = models.CharField(max_length=255, null=True, blank=True)
user = models.OneToOneField(User, null=True, blank=True)
main_character = models.ForeignKey('Character', null=True, blank=True, related_name='main_character')
signature = models.TextField(null=True, blank=True)
def __unicode__(self):
return self.battletag
项目
class Item(models.Model):
'''Details individual data for each item on a loot table'''
name = models.CharField(max_length=255, null=True)
item_id = models.IntegerField(null=True)
dropped_by = models.ForeignKey(Boss)
warforgeable = models.BooleanField(default=True)
bonus_string = models.CharField(max_length=255, blank=True, null=True)
def __unicode__(self):
return self.name
我需要将我的方法映射回Player
,以生成一个Player
对象的列表,该列表依赖于谁在其ProtectedList
的任何字段中拥有Item
。你知道吗
我知道Item
与ProtectionList
相关,而ProtectionList
与Player
相关,但是我想找到一种有效的方法来检查Item
是ProtectionList
对象中的外键的所有字段,因为被过滤的Item
可能位于任何字段中(减去player
和locked
字段)。你知道吗
我已经考虑过使用Q to或每个字段,但我不确定在更大的查询集上这会有多好。你知道吗
我还通过中间表查看,并将模型更改为多对多。你知道吗
我可能错了,但我觉得你的模型结构没有规范化。通过
Slots
,Player
和Item
之间存在M2M关系。考虑以下模型结构:使用API的
让我们创建一些初始数据:
获取所有玩家位置:
获取所有玩家物品:
添加新项目?你知道吗
检查插槽里有什么?你知道吗
查找有物品的玩家:
两位炼金术士又举了一个例子:
下面是此模型结构的一些查询示例:
你有一个玩家对象
player
,需要知道他/她的左手里是什么:您有一个Item对象
item
,希望知道它安装在哪个插槽player
:你有一个物品对象
item
,你想知道哪些玩家有这个物品:或者
取决于你更愿意使用的对象。我还没有测试上面的任何查询,但这应该让你开始。另外请注意,如果关系没有按您认为的方式排列(例如,
player
实际上没有item
),那么这种方式的链接(查询1&2)可能会抛出IndexError
,因此请做好可能捕捉到这种情况的准备。你知道吗迁移旧数据
我相信像这样的事情可以做到:
相关问题 更多 >
编程相关推荐