3

私はいくつかのモデルを持っています:Reviewはアルバム レビュー用のフィールドを持ち、Recordはアルバムの名前などでありBand、 はバンドの名前です。Recordに対して外部キーがあり、 に対してBand外部ReviewキーがありますRecord

Reviewすべての のドロップダウン選択ボックスを表示したいの管理フォームでRecord。現時点では、 の unicode メソッドRecordは次のとおりです。

def __unicode__(self):
    return self.record_name

これはあまり役に立たないので、次のように変更しました。

def __unicode__(self):
    return self.band.band_name + ' - ' + self.record_name  

これにより、それぞれRecord(3000 程度) に対してクエリが追加されますが、明らかに良くありません。

この回答を読んで、これをモデル管理者に追加しようとしましたRecord

def queryset(self, request):
    return super(RecordAdmin, self).queryset(request).select_related('band')

しかし、これは何の違いもありませんでした。

__unicode__n-squared クエリを発生させずに、モデルの表現で外部キー フィールドを使用することは可能ですか?

更新:モデルは次のとおりです(無関係なフィールドは削除されています):

class Review(models.Model):

    def __unicode__(self):
        # this is used in other places where we show review titles
        return self.record.band.band_name + ' - ' + self.record.record_name

    record = models.ForeignKey('Record')
    review_text = models.TextField()

class Record(models.Model):

    def __unicode__(self):
        # this generates a billion queries
        #return self.record_name
        return self.band.band_name + ' - ' + self.record_name  

    def band_and_title(self):
        return self.band.band_name + ' - ' + self.record_name

    band = models.ForeignKey('Band')
    label = models.ForeignKey('Label')
    record_name = models.CharField(max_length=175)

class Band(models.Model):

    def __unicode__(self):
        return self.band_name

    band_name = models.CharField(max_length=100)
4

2 に答える 2

1

select_related管理サイトが変更フォームを作成するときにを注入する必要があります。ModelAdmin.formfield_for_foreignkeyこれは、ModelAdminをオーバーライドすることで実行できます。このようなもの:

class ReviewAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "record":
            kwargs["queryset"] = Record.objects.all().select_related()

        return super(ReviewAdmin, self).formfield_for_foreignkey(
            db_field, request, **kwargs)
于 2015-07-02T20:02:40.390 に答える