再び壁に頭をぶつける。他の既知のフィールドを使用してタグを追加しようとしています
# models.py
class MyModel(models.Model):
...
tags = models.ManyToManyField(Tag, blank=True)
field_m2m = models.ManyToManyField('M2mModel', blank=True)
field_fk = models.ForeignKey('FkModel', blank=True, null=True)
...
def save(self, *args, **kwargs):
for inst in self.field_m2m.all():
self.tags.add(Tag.objects.get(name=inst.name))
self.tags.add(Tag.objects.get(name=self.field_fk.name))
super(MyModel, self).save(*args, **kwargs)
class FkModel(models.Model):
name = models.CharField(max_length=255, unique=True)
...
class M2mModel(models.Model):
name = models.CharField(max_length=255, unique=True)
...
field_m2m と field_fk が空ではないことは 100% 確信しています。重要なことは、既存のタグに対応するインスタンスがあることです。この部分をうまくカバーする他の機能があります。また、文字列 ( Tag.objects.get(name="mystring")
) を 101% 確実にハードコーディングしてみました。
まだ、管理パネルからタグが割り当てられていません。シェルで手順を実行しようとしましたが、そこで動作します。
>>> m = MyModel.objects.get(name='something')
>>> t = Tag.objects.get(name='sometag')
>>> m.tags.add(t)
>>> m.tags.all()
[<Tag: sometag>]
save() メソッドから動作させるには?
また、モデル インスタンスが初めて作成されるまで、トレースバックは次のように不平を言っています。"<MyModel: Something>" needs to have a value for field "mymodel" before this many-to-many relationship can be used.
前述の割り当てを行う前に、モデル インスタンスを保存する必要があると思いますよね? どうすればすべてを一度に行うことができますか?