0

私の動物モデルには3つのプロパティがあります。

  1. dog_name
  2. cat_name
  3. モンキーネーム

それらの1つを埋める必要があり(これ以上!動物は犬、猫、または猿です)、たとえばcat_nameを設定した場合、dog_nameとmonkey_nameを非アクティブにします(ユーザーは複数の名前を設定しないでください)。

django adminでこれを設定することは可能ですか? この例はばかげているかもしれませんが、私は自分の意図を説明しようとしました-不要なプロパティを非アクティブ化します。

4

4 に答える 4

2

可能な限り、冗長なフィールドを含むdbスキーマを避けようとします。動物テーブルにfkeyがある別の「動物タイプ」テーブルを考えてみましょう。

それで:

animal_type:

id       type_name
1        cat
2        dog
3        monkey

動物:

id       name          type
1        kitty         1
2        fido          2
3        rover         2
4        mr banannas   3

など、長期的にはあなたの痛みを救うでしょう

編集:以下のコメントに答えるには、モデルのclean()関数をオーバーライドしてみてください。

class YourModel(models.Model):
    first_property = models.FileField()
    second_property = models.ImageField()

    def clean(self)
        from django.core.exceptions import ValidationError
        if self.first_property.name not in ['', None] and \
           self.second_property.name not in ['', None]:
            raise ValidationError('Cannot have a first_property and a second_property!.')  

これにより、モデルを保存しようとするたびにエラーメッセージがスローされますが、フォームにこれら2つの値を実際に入力することはできません。

于 2012-11-27T17:29:21.453 に答える
1

必要なものがわかっている場合は、モデルプロキシexcludeを作成し、それらをDjango adminに登録し、adminモデルのfieldsまたはfieldsets属性を使用して不要なフィールドを非アクティブ化します。

# models.py

class Animal(models.Model):
    dog_name = models.CharField()
    cat_name = models.CharField()
    monkey_name = models.CharField()

class Dog(models.Model):
    class Meta:
        proxy = True

class Cat(models.Model):
    class Meta:
        proxy = True

class Monkey(models.Model):
    class Meta:
        proxy = True

# admin.py

class DogAdmin(models.Model):
    exclude = ['cat_name', 'monkey_name']

class CatAdmin(models.Model):
    fields = ['cat_name', 'other_field']

class MonkeyAdmin(models.Model):
    exclude = ['cat_name', 'monkey_name']

admin.site.register(Dog, DogAdmin)
admin.site.register(Cat, CatAdmin)
admin.site.register(Monkey, MonkeyAdmin)
于 2012-11-27T17:33:07.227 に答える
0

これを解決する別の方法は、設定時に「その他」のフィールドを無効にするjavascriptを追加することです。次に、フォーム/モデルの検証でこれを適用できます。

しかし、これに対処する最善の方法は、問題に適用できるのであれば、PT114が提案する方法だと思います。

于 2012-11-27T18:30:09.510 に答える
0

さまざまな動物がデータベースに保存されているさまざまなものを表す場合は、独自のテーブルを使用して個別のModelオブジェクトを作成し、GenericForignKeysを使用してそれらをリンクすることをお勧めします。

これはあらゆる種類の複雑さを追加しますが、djangoは通常のものよりも一般的なものの方が優れており、情報を保存したいように見える方法(実際には非常に一般的なIMHO)は、従来のリレーショナルデータベースでは困難です。

于 2012-11-27T23:19:44.970 に答える