1

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

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

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 序列化为 json 以获取 rest 资源时,结果将包括 Person 字段数据。

我来自.Net C# 背景。现在,由于我使用的是 Python/Django,所以我不知道如何实现这一点。

4

3 回答 3

1

Example of queryset which gets filtered list of Job objects:

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

You can access to persons associated by ForeignKey with Job objects in this way

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

If you exactly need all related objects on every Job record you should use select_related queryset

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

Serialization: You can use natural_keys, but it's limited with DB constraints. Or you can use Piston and define a Handler which will produce nested JSON.

Notice, you dont have to make AutoField for every model, it's specified by convention and can be reached at model_instance.id.

Also I recommend you to follow PEP8 conventions.

于 2011-08-03T20:22:30.643 回答
0

If you query your jobs with something like job = Job.objects.get(personid=1) you'll see that it pulls through the related fields too, it's voodoo behind the scenes. So essentially you can now do job.person.firstname, job.person.lastname etc...

于 2011-08-03T20:21:52.387 回答
0

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

那么工作就是一个人,这就是你所要求的。这不是抽象继承,因此您的数据库中将有两个表。

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

Job.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='')
于 2011-08-04T04:09:07.070 回答