Вставить данные в модель, используя цикл - PullRequest
0 голосов
/ 31 января 2020

model.py

class Tag(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name


class Question(models.Model):
    name = models.CharField(max_length=255)
    Tag_name = models.ManyToManyField(Tag)

    def __str__(self):
        return self.name

Я хочу ввести более 10000 данных в модель Вопроса, поэтому я использую l oop для этого, но это не сработало, как я могу ввести данные, используя l oop в модели вопросов.

Я пытался:

for i in range(1,3):
    p = Question(name='a'+str(i),Tag_name = 2) #id of tag and
    p.save()

Ошибка:

  File "<console>", line 1, in <module>
  File "filename", line 480, in __init__
  _setattr(self, prop, kwargs[prop])
  File "filename", line 537, in __set__
% self._get_set_deprecation_msg_params(),
  TypeError: Direct assignment to the forward side of a 
  many-to-many set is  prohibited. 
  Use Tag_name.set() instead.

Я знаю, что делаю неправильно.

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Вы должны использовать метод add, чтобы добавить объект в отношения многие ко многим. Примерно так:

tag = Tag.objects.get(pk=2)
for i in range(1,3):
    p = Question(name='a'+str(i),Tag_name = 2) #id of tag and
    p.save()
    p. Tag_name.add(tag)

Или используя обратное соотношение :

tag = Tag.objects.get(pk=2)
for i in range(1,3):
    p = tag.question_set.create(name='a'+str(i))

Обратите внимание, что для имени атрибутов класса следует использовать регистр змеи. Поэтому лучше переименовать Tag_name в tags, например:

tags = models.ManyToManyField(Tag)
0 голосов
/ 31 января 2020

Сделайте это:

tag = Tag.object.get(id=2)
for i in range(1,3):
    p = Question(name='a'+str(i)))
    p.save()
    p.Tag_name.add(tag)
...