Использование многих-многих элементов перед сохранением () - PullRequest
0 голосов
/ 03 февраля 2020

Я использую модели с полями «многие ко многим»

Вот что я хочу сделать:

  1. Извлечение элементов из Интернета и сохранение в памяти

  2. Фильтр товаров. удалить или добавить поле «многие ко многим».

  3. Сохранить в базе данных.

моя модель

class Tweet(models.Model):
    text = models.TextField(null=True)
    genre = models.ManyToManyField(genre)

фильтр

tweets = fetchfromweb()

filtered = []
for tweet in tweets:
    if tweet.text == x :
        tweet.genre.add(genreObj)
        filtered.append(tweet)
    else:
        pass

for i in filtered: // write in db
    i.save()

Однако он показывает ошибку, где tweet.genre.add(genreObj).

Без сохранения () я не смог получить доступ ко многим-многим полям.

, так что сейчас мое решение таково.

tweets = fetchfromweb()

filtered = []
for tweet in tweets:
    tweet.save() ## save and create manytomanyfield
    if tweet.text == x :
        tweet.genre.add(genreObj)
        tweet.save()
    else:
        tweet.remove()

Однако для этого нужно много вставить и удалить дб, это хорошая практика ???

Или есть какие-нибудь хорошие идеи ???

1 Ответ

1 голос
/ 03 февраля 2020

Вы не можете добавить записи M2M до того, как tweet будет сохранено, потому что tweet должен иметь первичный ключ, который необходимо установить перед добавлением записей, связанных с M2M. Вы можете проверить документы .

Не уверен, что эта работа работает, но вы можете попробовать atomi c транзакция:

with transaction.atomic():
    for tweet in tweets:
        tweet.save() ## save and create manytomanyfield
        if tweet.text == x :
           tweet.genre.add(genreObj)
    else:
        tweet.remove()

Также , вам не нужно снова вызывать save после добавления записей M2M.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...