将对象放入字符串然后放入Python的列表中

时间:2014-03-24 01:01:03

标签: python django list

这里的标题可能有点令人困惑,所以让我解释一下。

首先,我有一个项目列表的模型,它是另一个模型的外键。外键对象具有访问wh_item_id和wh_item_name的权限。我试图将这些信息放入这种格式

wh_item_id=wh_item_name

例如,它将返回:

102944=Hands of the Light

现在它变得棘手的部分是我希望模型中的每个字段都放入这个字符串,然后放入一个可以在以后访问的列表中。减去模型中的任何空白字段。

原始模型:

class ProtectionList(models.Model):
    character = models.ForeignKey(Character)
    main_hand = models.ForeignKey(Loot, related_name="Main Hand", blank=True, null=True)
    off_hand = models.ForeignKey(Loot, related_name="Off Hand", blank=True, null=True)
    head = models.ForeignKey(Loot, related_name="Head", blank=True, null=True)
    neck = models.ForeignKey(Loot, related_name="Neck", blank=True, null=True)
    shoulder = models.ForeignKey(Loot, related_name="Shoulder", blank=True, null=True)
    back = models.ForeignKey(Loot, related_name="Back", blank=True, null=True)
    chest = models.ForeignKey(Loot, related_name="Chest", blank=True, null=True)
    wrist = models.ForeignKey(Loot, related_name="Wrist", blank=True, null=True)
    hands = models.ForeignKey(Loot, related_name="Hands", blank=True, null=True)
    waist = models.ForeignKey(Loot, related_name="Waist", blank=True, null=True)
    legs = models.ForeignKey(Loot, related_name="Legs", blank=True, null=True)
    feet = models.ForeignKey(Loot, related_name="Feet", blank=True, null=True)
    ring1 = models.ForeignKey(Loot, related_name="Ring 1", blank=True, null=True)
    ring2 = models.ForeignKey(Loot, related_name="Ring 2", blank=True, null=True)
    trinket1 = models.ForeignKey(Loot, related_name="Trinket 1", blank=True, null=True)
    trinket2 = models.ForeignKey(Loot, related_name="Trinket 2", blank=True, null=True)

因此,此列表中最多可包含16个项目,但我需要删除显示为“无”的列表中的任何内容。

例如,

main_hand返回一个对象 off_hand返回None head返回一个对象 ...(为简单起见,我现在只使用3个字段)

我希望列表如下所示:

item_list = [1234=main hand itemname,5678=head itemname]

错过了off_hand。

Loot模型供参考

class Loot(models.Model):
    wh_item_id = models.CharField(verbose_name="Wowhead Item ID", max_length=255)
    wh_item_name = models.CharField(verbose_name="Wowhead Item Name", max_length=255)
    gear_type = models.CharField(max_length=255, blank=True, null=True)
    lockout_tier = models.IntegerField(blank=True, null=True) 

编辑:

我基本上追求的是以下内容:

item_list = [item_list.main_hand.wh_item_id + '=' + item_list.main_hand.wh_item_name,item_list.off_hand.wh_item_id + '=' + item_list.off_hand.wh_item_name,item_list.head.wh_item_id + '=' + item_list.head.wh_item_name,item_list.neck.wh_item_id + '=' + item_list.neck.wh_item_name,item_list.shoulder.wh_item_id + '=' + item_list.shoulder.wh_item_name,item_list.back.wh_item_id + '=' + item_list.back.wh_item_name,item_list.main_hand.wh_item_id + '=' + item_list.chest.wh_item_name,item_list.main_hand.wh_item_id + '=' + item_list.main_hand.wh_item_name,item_list.main_hand.wh_item_id + '=' + item_list.main_hand.wh_item_name,item_list.main_hand.wh_item_id + '=' + item_list.main_hand.wh_item_name,item_list.main_hand.wh_item_id + '=' + item_list.main_hand.wh_item_name,item_list.main_hand.wh_item_id + '=' + item_list.main_hand.wh_item_name,item_list.main_hand.wh_item_id + '=' + item_list.main_hand.wh_item_name,item_list.main_hand.wh_item_id + '=' + item_list.main_hand.wh_item_name,item_list.main_hand.wh_item_id + '=' + item_list.main_hand.wh_item_name,item_list.main_hand.wh_item_id + '=' + item_list.main_hand.wh_item_name]

但我只希望那些不返回None的项目在该列表中。

3 个答案:

答案 0 :(得分:0)

我相信Django有一个model_to_dict功能,可让您像dict一样迭代对象。

from django.forms.models import model_to_dict

char_dict = model_to_dict(Your_Model_Instance)

然后,您可以迭代该字典并以您希望忽略None值的任何方式获取您要查找的内容。举个例子 -

my_list = []
for k, v in char_dict.iteritems():
    if v is not None:
        my_list.append("{}={}".format(k, v))

答案 1 :(得分:-1)

我们有一个非常好的格式,用于将对象(或类,因为Python类是对象)表示为字符串:JSON。如果您不想使用它,或者您发现JSON解析器不适合您,请注意您可以使用class_name.__dict__遍历类/对象上的属性。因此,循环遍历班级中的所有key, val对,并根据需要将它们添加到列表中。您可能希望过滤掉以_开头的那些。

示例:

class myClass:
    thing1 = 'hello'
    thing2 = 'world'

[key + '=' + str(val) for key, val in myClass.__dict__.iteritems() if key[0] != '_']

给出:

['thing2=world', 'thing1=hello']

答案 2 :(得分:-1)

你也可以考虑正确地规范化你的数据 - 创建一个“身体位置”表,其中包含“主手”,“副手”等(永不改变),然后创建一个“人体位置” ,它有角色,身体位置和战利品。你可以在How to define two fields "unique" as couple所示的人身和身体位置上使人体位置独特,以确保一个角色只有一个“主手”等。