0

非抽象親クラスを持つ:

class Animal(models.Model)

および 2 つのサブクラス:

class Cow(Animal)
class Dog(Animal)

と呼び出し

Dog.objects.order_by('name') 

データベースにクエリを実行し、結合されたレコードを返します。

SELECT ... FROM dog 
INNER JOIN animal ON (dog.animal_ptr_id = animal.id) 
ORDER BY dog.name ASC

ただし、私の場合、「犬」はテーブルではなく、データベースで定義された複雑なビューです。ビューには、animal_ptr__id によってアクセス可能な動物 ID を含む、「animal」から必要なすべてのフィールドが既に含まれています。

django がクエリを大幅に遅くする INNER JOIN を作成しないようにするにはどうすればよいですか?

4

2 に答える 2

0

dog抽象基本クラスを使用していないため、この場合はテーブルではないと考える理由がよくわかりません。したがって、これは複数テーブルの継承であり、各サブクラスにテーブルがあります。

INNER JOIN私の知る限りでは、複数テーブルの継承を回避する最善の方法は、 を設定して抽象基本クラスを使用することです。これはあなたがすべきことのように思えますが..abstract = Trueclass Meta

ただし、複数テーブルの継承を使用する必要がある場合は、生の SQL クエリを使用することができます。このようなものがうまくいくかもしれません

Dog.objects.raw('SELECT ... FROM myapp_dog ORDER BY dog.name ASC')

dogテーブルだけでは、基本クラスから継承したプロパティは含まれませんAnimal。これらの継承されたプロパティを取得するには、JOIN明らかな何かを見逃していない限り、 a は避けられないと思います..

于 2012-10-21T07:43:10.597 に答える
0

ただし、私の場合、「犬」はテーブルではなく、データベースで定義された複雑なビューです。

managed = Falseを設定する必要がありDogます。それ以外の場合は、ビューを使用していませんが、(アプリ名はapp_dogどこにありますか)という中間テーブルを使用しています。app

これにより、django はテーブルを作成できなくなりますが、内部で定義されたテーブル (この場合はビュー) を使用できます。キーも必ず指定し、テーブル名を指定してください。

于 2012-10-21T08:14:43.740 に答える