1

私はしばらくこれに対する答えを探していました。あるモデルから関連モデルにフィールドを追加し、関連モデル データをクエリするにはどうすればよいですか。

以下に例を示します。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 Framework を取得して、これらの追加のプロパティをシリアル化します。新しい投稿の時間。

今私ができるようにしたいのは、ジョブをクエリして、関連する個人データを取得し、ジョブに個人フィールドを持たせることです。このようにして、ジョブを照会するときに、job.FirstName を使用できます。基本的に、Job から Person フィールドへのショートカットを作成したいと考えています。これは、Job が Person のフィールドを継承しているようなものです。

これにより予想されるサイトへの影響は、ジョブを残りのリソースの json としてシリアル化するときに、結果に Person フィールド データが含まれることです。

私は .Net C# のバックグラウンドを持っています。Python/Django を使用しているので、これを実現する方法がわかりません。

4

3 に答える 3

1

Jobオブジェクトのフィルタリングされたリストを取得するクエリセットの例:

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 の制約によって制限されます。または、Pistonを使用して、ネストされた JSON を生成する Handler を定義することもできます。

モデルごとに AutoField を作成する必要はないことに注意してください。AutoField は慣例で指定されており、model_instance.id でアクセスできます。

また、PEP8規則に従うことをお勧めします。

于 2011-08-03T20:22:30.643 に答える
0

job = Job.objects.get(personid=1)関連するフィールドも通過することがわかるようなものでジョブをクエリすると 、舞台裏でブードゥーです。したがって、基本的に、次のことができるようjob.person.firstnameになりjob.person.lastnameました...

于 2011-08-03T20:21:52.387 に答える
0

これを試してみてください、それはあなたが望むもののように聞こえます。

次に、仕事は人であり、それがあなたが求めているものです。これは抽象継承ではないため、DB には 2 つのテーブルが存在します。

$> # 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 に答える