1

ここにモデルがあります。FilterValue モデルで既に参照されている FilterValue モデルでの Filter オブジェクトの参照を避ける必要があります。

    class Filter(models.Model):
        name = models.CharField('Name', max_length=255)

    class FilterValue(models.Model):
        name = models.CharField('Name', max_length=255)
        filter = models.ForeignKey(Filter, limit_choices_to=Q(***?***))

の代わりに何が可能かを探しています ? .

4

3 に答える 3

1

OPのコメントから理解したように、重複するエントリの追加を禁止するという考え方です。

しかし、それを行うためのより安全な方法があります。

class FilterValue(models.Model):
    name = models.CharField('Name', max_length=255)
    filter = models.ForeignKey(Filter)

    class Meta:
        unique_together = (("name", "filter"),)

元のソリューションでは、管理者またはフォームにフィルターのリストが表示されるだけですが、プログラムで複製を追加することは実際には禁止されていません。

于 2012-06-14T15:31:39.380 に答える
1

そのようにすることはできませんが、フォームの一部として行うことはできます。具体的に__init__は、フォームのメソッド中に、関連フィールドのクエリセットを変更できます。

django.contrib.admin フォームでクエリセットをフィルタリングするの管理者でこれを行う方法について書きました

于 2012-06-14T13:11:59.453 に答える
0

別の方法で、管理者でFilterValueAdminを編集専用にし、 FilterAdminモデルでインラインと同じものを追加しました。

class FilterValueInline(admin.StackedInline):
   formset = FilterValueInlineFormset
   model = FilterValue
   max_num = 1
   can_delete = False


class FilterAdmin(admin.ModelAdmin):
   list_display = ('id', 'name')
   inlines = [FilterValueInline]


class FilterValueAdmin(admin.ModelAdmin):
   """Filter value has to be added via the filter table"""
   def has_add_permission(self, request):
       return False
   def has_delete_permission(self, request, obj=None):
       return False
   actions = None
   list_display = ('id', 'name', 'filter')
于 2012-06-15T06:48:40.563 に答える