Python setattr()方法是否创建临时对象?

Python setattr()方法是否创建临时对象?,python,django,django-models,Python,Django,Django Models,这是一个很好的答案 然而,我对这个组件的工作方式特别感兴趣:member、\u=member.objects.get\u或\u create(name=self.name)请查看上下文和下面的语句 class Member(models.Model): def __unicode__(self): return self.record def was_published_recently(self): retur

这是一个很好的答案

然而,我对这个组件的工作方式特别感兴趣:member、\u=member.objects.get\u或\u create(name=self.name)请查看上下文和下面的语句

 class Member(models.Model):
        def __unicode__(self):
            return self.record

        def was_published_recently(self):
            return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
        was_published_recently.admin_order_field = 'pub_date'
        was_published_recently.boolean = True
        was_published_recently.short_description = 'Entered recently?'

        record = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date')


   class Data(models.Model):

    member = models.ForeignKey(Member)
    dob = models.CharField(max_length=200, blank=True, null=True)
    event = models.CharField(max_length=200, blank=True, null=True)
    description = models.CharField(max_length=200, blank=True, null=True)
    gender = models.CharField(max_length=200, blank=True, null=True)

    def save(self, *args, **kwargs):

        **member, _ = Member.objects.get_or_create(name = self.name)**
        # can update member here with other fields that relate to them
        self.member = member
        super(Data, self).save(*args, **kwargs)


//----

        json = [{" Record": 12345,
    "Name": "Joe",
    "Event":" Initial task completed",
    "TeamID": 12345,
    "IndiviualID":"",
    "Description":" Just a description",
    "Date": "1/3/13 9:00"},{" Record": 5555,
    "Name": "Jane",
    "Event":" A different task completed",
    "TeamID": 9999,
    "IndiviualID":"",
    "Description":" Just another description",
    "Date": "1/13/13 6:00"}]

        for item in json:

            d = Data()

            for k,v in item.iteritems():
                **setattr(d, k.lower(), v)**

            d.save()

请注意,self.name在技术上访问我的数据对象中的name变量,而事实上,name变量在我的数据对象模型定义中并不存在。这就是我问题的核心:这段代码是如何工作的?这让我觉得有一种临时数据对象实际上包含Data.name(又称self.name),但在被丢弃之前,它确实包含Data.name,因为它在数据的JSON表示中,但不在我的数据对象中。

不,它根本不是这样工作的

Python对象是动态的。您可以在任意点上定义您喜欢的任何属性。无论您是
setattr(d,“name”,“foo”)
还是
d.name=foo
,结果都是完全相同的:
d
实例获得一个属性
name
,它以前是否有一个属性,以及类中是否有提到它的定义


Django模型添加了自己的特殊语法来定义存储在数据库中的字段,但在其下面它们只是Python对象,因此您可以根据自己的喜好动态地在它们上定义额外的属性。

不,这根本不是它的工作方式

Python对象是动态的。您可以在任意点上定义您喜欢的任何属性。无论您是
setattr(d,“name”,“foo”)
还是
d.name=foo
,结果都是完全相同的:
d
实例获得一个属性
name
,它以前是否有一个属性,以及类中是否有提到它的定义


Django模型添加了自己的特殊语法,用于定义它们存储在数据库中的字段,但在下面它们只是Python对象,因此,您可以根据自己的喜好在这些对象上动态定义额外的属性。

因此您可以将属性添加到Python对象中,但显然,除非您告诉Django models(即定义它),否则无法将其添加到数据库中。对吗?谢谢非常棒的解释。有关详细信息,请参见文档,但基本上,
setattr(d,“name”,“foo”)
只解析为
d.。\uuuu dict\uuu[“name”]=“foo”
。(您可以通过几种不同的方式对其进行自定义,以完成不同的任务,但默认情况下只需使用
\uu dict\uu
)非常有用的python特性,因此您可以将属性添加到python对象中,但显然,除非您告诉Django模型(即定义它),否则无法将其添加到数据库中。对吗?谢谢非常棒的解释。有关详细信息,请参见文档,但基本上,
setattr(d,“name”,“foo”)
只解析为
d.。\uuuu dict\uuu[“name”]=“foo”
。(您可以通过几种不同的方式对其进行自定义以完成不同的任务,但默认情况下只需使用一个非常有用的python功能