0

次のような Django モデルがあります。

class Competitor(models.Model):
  """
  Competitor model object
  """
  name = models.CharField(max_length=20)
  easy = ArrayField(models.PositiveSmallIntegerField(), size=9, null=True, blank=True, verbose_name='Easy Mode')
  hard = ArrayField(models.PositiveSmallIntegerField(), size=9, null=True, blank=True, verbose_name='Hard Mode')
  tematicas = ArrayField(models.PositiveSmallIntegerField(), size=7, null=True, blank=True, verbose_name='Tematicas')
  random_score = ArrayField(models.PositiveSmallIntegerField(), size=9, null=True, blank=True, verbose_name='Random Mode')
  min1 = ArrayField(models.PositiveSmallIntegerField(), size=9, null=True, blank=True, verbose_name='minuto 1')
  min2 = ArrayField(models.PositiveSmallIntegerField(), size=9, null=True, blank=True, verbose_name='minuto 2')
  deluxe = ArrayField(models.PositiveSmallIntegerField(), size=14, null=True, blank=True, verbose_name='Deluxe')
  replica = ArrayField(models.PositiveSmallIntegerField(), size=9, null=True, blank=True, verbose_name='Replica')

また、index でプロパティにアクセスできるようにしたいので、 と書くcompetitor[0]と の値が返されるはずですname

私は見てきましたが、この__iter__()質問によれば、「メソッドと__getitem__()その他のメソッドの両方を実装する」必要があります。しかし、このメソッド内で何をすべきかわかりません。

誰でもこれを行う方法を知っていますか?

4

3 に答える 3

0

まず、@julianofischer の回答に感謝します。この回答で実装するメソッドを実装する方法を教えてくれました。

[]最初に、次のように、クラスのプロパティとしてアクセスできるようにするフィールドの名前を含む文字列のリストを追加します。

class Competitor(Model):
  """
  Competitor model object
  """
  name = CharField(max_length=20)
  easy = ArrayField(PositiveSmallIntegerField(), size=9, null=True, blank=True, verbose_name='Easy Mode')
  hard = ArrayField(PositiveSmallIntegerField(), size=9, null=True, blank=True, verbose_name='Hard Mode')
  tematicas = ArrayField(PositiveSmallIntegerField(), size=7, null=True, blank=True, verbose_name='Tematicas')
  random_score = ArrayField(PositiveSmallIntegerField(), size=9, null=True, blank=True, verbose_name='Random Mode')
  min1 = ArrayField(PositiveSmallIntegerField(), size=9, null=True, blank=True, verbose_name='minuto 1')
  min2 = ArrayField(PositiveSmallIntegerField(), size=9, null=True, blank=True, verbose_name='minuto 2')
  deluxe = ArrayField(PositiveSmallIntegerField(), size=14, null=True, blank=True, verbose_name='Deluxe')
  replica = ArrayField(PositiveSmallIntegerField(), size=9, null=True, blank=True, verbose_name='Replica')
  _list = [ 'easy', 'hard', 'tematicas', 'random_score', 'min1', 'min2', 'deluxe', 'replica' ]

次に、値の取得と設定の両方が必要な場合は、次のように__getitem__andを実装する必要があります__setitem__

def __getitem__(self, index: int):
  return self.__dict__[self._list[index]]

def __setitem__(self, index: int, value: list):
  self.__dict__[self._list[index]] = value
  self.save(update_fields=[self._list[index]])

このように、 を使用してフィールドの値にアクセスし__getitem__、 を使用し.__dict__[index]てそれらを返し、 を使用し__setitem__てそれらを直接変更します。

于 2021-04-03T17:02:17.690 に答える