我一直在寻找这个问题的答案。如何将一个模型中的字段添加到相关模型中,并查询相关模型的数据
这里有一个例子:一个人有许多工作。
class Person(models.Model):
PersonId = models.AutoField(primary_key=True)
FirstName = models.CharField(max_length=200, default='')
LastName = models.CharField(max_length=200, default='')
class Job(models.Model):
JobId = models.AutoField(primary_key=True)
JobName = models.CharField(max_length=200, default='')
Person = models.ForeignKey(Person, db_column='PersonId')
def _fullname(self):
return self.Person.FirstName + " " + self.Person.LastName
fullname = property(_fullname)
上面的代码可以工作!
jobs = Job.objects.select_related()
for job in jobs:
print job.fullname
现在我想我有一个不同的问题。让Django Rest框架序列化这些附加属性。是时候发一个新帖子了。
现在我想要能够做的是查询工作,并获得相关的人员数据,以及在工作上的人员字段。这样,当我查询工作时,我可以使用job.FirstName。我基本上想从Job创建到Person字段的快捷方式。这有点像Job继承了Person的字段。
预期的站点效果是,当将Job序列化为rest资源的json时,结果将包括Person字段数据。
我来自。net c#背景。现在,因为我使用Python/Django,我不知道如何使这发生
获取作业对象的过滤列表的查询集示例:
joblist = Job.objects.filter(statement1,statement2...)
您可以通过以下方式访问由ForeignKey与Job对象关联的人员
for j in joblist:
print j.Person.FirstName, j.Person.LastName
如果您确实需要每个Job记录上的所有相关对象,您应该使用select_related queryset
joblist = Job.objects.select_related().filter(statement1,statement2...)
序列化:您可以使用natural_keys,但它受到DB约束的限制。或者你可以使用活塞并定义一个Handler来生成嵌套的JSON。
注意,你不必为每个模型都创建AutoField,它是按照惯例指定的,可以通过model_instance.id访问。
我还建议您遵循PEP8约定。
如果您使用如下命令查询您的工作job = Job.objects.get(personid=1)
你会看到它也通过相关的领域,它是在幕后的巫术。所以你可以选择job.person.firstname
, job.person.lastname
等等
试试这个,听起来像是你想要的。
那么工作就是一个人,这就是你所要求的。这不是抽象继承,所以在你的DB中将有两个表。
$> # This will dump the sql that's generated.
$> ./manage.py sql this_app
工作。FirstName就行。仔细阅读模型继承。你可能最终需要使用django-model-utils的ModelInheritance管理器,它非常好。
class Person(models.Model):
PersonId = models.AutoField(primary_key=True)
FirstName = models.CharField(max_length=200, default='')
LastName = models.CharField(max_length=200, default='')
class Job(Person):
JobId = models.AutoField(primary_key=True)
JobName = models.CharField(max_length=200, default='')