0

ConfirmationFieldフィールドタイプが欲しいです。このフィールドをブールフィールドのように機能させたい。この情報をデータベースに保存する必要はありません。代わりに、確認の日付を別のフィールドに保存したいと思います。

class MyModel(models.Model):
    confirmation = ConfirmationField()


m = MyModel()
m.confirmation # False
m.confirmation_timestamp # None

m.confirmation = True
m.save()

m.confirmation_timestamp # datetime object


m.confirmation = False
m.save()

m.confirmation_timestamp # None again

両方のフィールドをFieldインスタンスとして持つ必要があります。たとえば、それらを Admin で使用できるようにする必要があります。

ドキュメントを読んでコードを確認し、ForeignKeyデータベースの列名を次のコードで変更しました。

def get_attname(self):
    return '%s_id' % self.name

しかし、例として残りのコードをどのように使用できるかを正確に理解できませんでした。私の目標はそれほど複雑ではないようです。

ImageFieldモデルを保存すると、保存された追加情報も見つかりました。

    if self.field.width_field:
        setattr(self.instance, self.field.width_field, self.width)
    if self.field.height_field:
        setattr(self.instance, self.field.height_field, self.height)

もちろん、confirmationそれ自体をデータベースに保存したくありません。confirmation_timestamp( -> confirmation) None==Falseおよび<datetime instance>==であるため、冗長性が生じますTrue

任意のポインタ/アイデアをいただければ幸いです。

ありがとう。

編集:これは現在不可能のようです。APIを変更することになりました。これは、私がどのようにそれを行ったかを示すためのスニペットです。

    value = {'BooleanField': True,
             'DateTimeField': datetime.datetime.now(),
             'DateField': datetime.date.today(),
             'IntegerField': 1,
            }[instance._meta.get_field(field_name).get_internal_type()]
    setattr(instance, field_name, value)

上記の任意のタイプの確認フィールドを持つことができ、正しい値が設定されます。そして、確認チェックは で行うことができますbool(getattr(instance, field_name)

4

1 に答える 1

6

これが正しければ、次のことを考慮してください。

class Modelname(models.Model):
    """(Modelname description)"""

    confirmation_timestamp = models.DateTimeField(blank=True)

    def _set_confirmation(self, value):
        if not value:
            self.confirmation_timestamp = None
        else:
            self.confirmation_timestamp = datetime.datetime.now()

    def _get_confirmation(self):
        return bool(self.confirmation_timestamp)

    confirmation = property(_get_confirmation, _set_confirmation)
    confirmation.short_description = "Confirmation"
    confirmation.boolean = True # have it nicely displayed in admin
于 2009-01-12T14:32:17.157 に答える