Как добавить несколько объектов внутри внешнего ключа в Django

Так что я пытался заставить мое представление django создавать модель автора как экземпляр, а затем сохранять несколько объектов внутри внешнего ключа. Есть идеи, как это сделать?

Я пробовал создать экземпляр автора, а затем установить атрибут tiktok экземпляра автора на новый экземпляр модели tiktok с указанием desc, likes и т.д. Это просто обновляет предыдущее значение, а не добавляет новый объект tiktok.

Models.py

from django.db import models

# Create your models here.
class TikTok(models.Model):
    slug = models.SlugField(max_length=300, null=True)
    desc = models.TextField(max_length=500, blank=True)
    likes = models.CharField(default=None, blank=True, max_length=100)
    shares = models.CharField(default=None, blank=True, max_length=100)
    comments = models.CharField(default=None, blank=True, max_length=100)
    plays = models.CharField(default=None, blank=True, max_length=100)
    videoUrl = models.CharField(default=None, blank=True, null=True, max_length=500)
    videoImg = models.CharField(default=None, blank=True, null=True, max_length=500)
    music = models.CharField(default=None, blank=True, null=True, max_length=500)

    def __str__(self):
        return self.desc

class Author(models.Model):
    userhandle = models.CharField(max_length=100, blank=True)
    email = models.CharField(max_length=150, null=True, blank=True)
    verified = models.BooleanField(null=True)
    followers = models.IntegerField(default=0)
    tiktoks = models.ForeignKey(TikTok, on_delete=models.CASCADE, null=True, blank=True)

    def __str__(self):
        return self.userhandle

А затем создать экземпляры в моих представлениях.

Другими словами, мне нужна одна модель автора и множество тиктоков, связанных с ней.


Вот как должен выглядеть вывод:

{
   id: 1,
   userhandle: 'user'
   email: 'user@gmail.com'
   verified: True
   tiktoks: [
      #multiple arrays of tiktoks
      {
         desc: 'desc1',
         likes: 40,
         ...
      }, 
      {
         desc: 'desc2',
         likes: 40,
         ...
      }
      ...
   ]
}

Любая помощь была бы признательна, спасибо.

Вы можете сделать это 3 способами

  1. Сделать поле TikTok много ко многим
  2. Создайте внешнюю таблицу для хранения автора и тиктока FK
  3. .
  4. Сделайте поле tiktok строковым и храните идентификаторы следующим образом 1,2,3

Сначала вы измените поле tiktok на это или похожее. tiktoks = models.ManyToManyField(TikTok)

Супер базовый вид с использованием формы

def create_tiktok(request):
    if request.method == 'POST':
        authorObj = Author.objects.filter(pk=request.POST.get('pk')).first()
        if authorObj:
            form = TikTokForm(request.POST)
            if form.is_valid():
                o = form.save()
                authorObj.tiktoks.add(o)

Пример Удалить

# format: model.field.action(obj)

authorObj.tiktoks.remove(TikTok.objects.get(pk=1))

Пример использования

authorObj = Author.objects.get(userhandle='Nealium')

# Looping through all
for i in authorObj.tiktoks.all():
    print(i) # <TikTok Object>

# Fetching a specific
authorObj.tiktoks.filter(slug='test').first()


# Mass Adding
tiktokList = TikTok.objects.filter(slug__icontains='te')
authorObj.tiktoks.add(*tiktokList)


# Mass Remove
authorObj.tiktoks.add(*tiktokList)


# Clear entire field
authorObj.tiktoks.clear()
Вернуться на верх