2

私はポートフォリオアプリケーションを開発しています。このアプリケーション内には、次のような「Project」というモデルがあります。

class Project(models.Model):
    ... 
    images = models.ManyToManyField(Image)
    ...

したがって、基本的に、このプロジェクトには一連の画像を含めることができます (これらの画像はいずれも別のプロジェクトに属している可能性があります)。

ここで追加したいのは、これらの「イメージ」の 1 つが「lead_image」であることを指定する方法です。

したがって、次のようなものを追加できます。

class Project(models.Model):
    ... 
    images = models.ManyToManyField(Image, related_name='images')
    lead_image = models.ForeignKey(Image, related_name='lead_image')
    ...

ただし、この場合の問題は、lead_image が任意のイメージになる可能性があることです。私が本当に望んでいるのは、このモデル インスタンスに属する「イメージ」の 1 つにすることです。

「ForeignKey.limit_choices_to」引数を使用する必要があると考えていますが、これを使用する方法がわかりません...特に、モデル インスタンスが最初に作成されたときは、「 images」ディレクトリ。

どんな助けでも大歓迎です。

ダグ

4

2 に答える 2

2

問題に対する別のアプローチは、ブール型プロパティ'is_lead_image'を持つ中間テーブルを使用することです。

class Image(models.Model):
    ...

class Project(models.Model):
    images = models.ManyToManyField(Image, through='ProjectImage')
    ...

class ProjectImage(models.Model):
    image = models.ForeignKey(Image)
    project = models.ForeignKey(Project)
    is_lead_image = models.Boolean(default=False)

    def save(self, *args, **kwargs):
        if self.is_lead_image:
            self._default_manager.filter(project=self.project).update(is_lead_image=False)
        return super(ProjectImage, self).save(*args, **kwargs)

*注:必要に応じて、アクセス権がある場合は、is_lead_imageフィールドを追加してImageクラスに直接保存することもできます。

于 2009-09-21T21:49:56.773 に答える
2

管理ツールで制限効果を達成したい場合は、formfield-for-foreignkey メソッドをオーバーライドして、独自のフィルターを挿入できます。

class ProjectAdmin(admin.ModelAdmin):

    # ...

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "lead_image":
            kwargs["queryset"] = self.model.images.all()
            return db_field.formfield(**kwargs)
        return super(ProjectAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

ここで私が目にする問題 (選択した画像からのみ選択するという一般的な考え方) は、新しいモデルの場合、最初はページの読み込み時に model.images が設定されないことです。サーバー側のトリックに関係なく、おそらくこの問題に直面するでしょう。

動作する可能性がありますが、追加のクリックが必要です。モデルが最初に作成されると、ManyToMany model.images が選択されます。選択後、[保存して続行] をクリックすると、これらの画像が model.lead-image FK フィールドに表示されます。

もう 1 つのオプションは、デフォルトの管理フォームをオーバーライドして、何かカスタムを作成することです (「リード画像」フィールド コンボ ボックスを自動更新するカスタム ファンシー パンツ JavaScript のようにカスタム)。

于 2009-09-21T22:22:22.293 に答える