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

时间:2011-08-03 19:26:39

标签: django django-models django-inheritance

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

这是一个例子:一个人有很多工作。

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 Framework以序列化这些附加属性。新帖子的时间。

现在我想要做的是查询作业并获取相关人员数据以及在工作中拥有人员字段。这样当我查询作业时,我可以使用job.FirstName。我基本上想从Job中创建Person字段的快捷方式。这有点像Job继承Person的字段。

预期的网站效果是将Job作为json序列化为rest资源时,结果将包括Person字段数据。

我来自.Net C#背景。现在,因为我使用Python / Django,我不知道如何实现这一点。

3 个答案:

答案 0 :(得分:1)

查询集的示例,它获取作业对象的过滤列表:

joblist = Job.objects.filter(statement1,statement2...)

您可以通过这种方式访问​​ForeignKey与Job对象关联的人

for j in joblist:    
    print j.Person.FirstName, j.Person.LastName

如果您确实需要每个作业记录上的所有相关对象,则应使用select_related queryset

joblist = Job.objects.select_related().filter(statement1,statement2...)

<强>序列化: 您可以使用natural_keys,但它受限于数据库约束。或者您可以使用Piston并定义一个将生成嵌套JSON的Handler。

注意,您不必为每个模型制作AutoField,它是按惯例指定的,可以通过model_instance.id访问。

另外,我建议您遵循PEP8惯例。

答案 1 :(得分:0)

如果你用类似的东西查询你的工作 job = Job.objects.get(personid=1)你会看到它也会通过相关领域,这是幕后的伏都教。所以基本上你现在可以做job.person.firstnamejob.person.lastname等......

答案 2 :(得分:0)

试试这个,听起来就像你想要的那样。

然后,工作就是一个人,这就是你所要求的。这不是抽象继承,因此DB中会有两个表。

$> # This will dump the sql that's generated.
$> ./manage.py sql this_app

Job.FirstName可以使用。阅读model inheritance。您甚至可能需要使用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='')