Django:如何继承和查询相关字段



我一直在寻找这个问题的答案。如何将一个模型中的字段添加到相关模型中,并查询相关模型的数据

这里有一个例子:一个人有许多工作。

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='')

最新更新