Django полей многие ко многим - PullRequest
0 голосов
/ 04 апреля 2020

Я хочу добавить только одного пользователя от Available classic до Chosen classic, но не со страницы администратора, если пользователь нажимает кнопку

enter image description here

Я пробовал это

pro = Profile(user=request.user)
pro.classic.add(name='Frank Sinatra-i love you baby')

, но я получаю это error

enter image description here

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

дай мне это error

enter image description here

модель мю code

from django.db import models

# Create your models here.

from django.utils import timezone
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver



class RequestSong(models.Model):
    music = models.CharField(max_length=150, blank=False, null=False)
    stampDate = models.DateTimeField(default=timezone.now, blank=False, null=False)

    def __str__(self):
        return self.music


class HelpUser(models.Model):
    email = models.EmailField(blank=False, null=False)
    helpMessege = models.TextField(blank=False, null=False)
    stampDate = models.DateTimeField(default=timezone.now)
    def __str__(self):
        return str(self.email)


class Language(models.Model):
    language = models.CharField(
        max_length=2, 
        choices=[
            ('AR', 'Arabic'),
            ('EN', 'English'),
        ],
        default='AR'
    )

    def __str__(self):
        return self.language



class ChillOut(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    music = models.FileField(upload_to='', max_length=100, blank=True, null=True)
    lang = models.ForeignKey(Language, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class Sad(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    music = models.FileField(upload_to='', max_length=100, blank=True, null=True)
    lang = models.ForeignKey(Language, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class Happy(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    music = models.FileField(upload_to='', max_length=100, blank=True, null=True)
    lang = models.ForeignKey(Language, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class Romantic(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    music = models.FileField(upload_to='', max_length=100, blank=True, null=True)
    lang = models.ForeignKey(Language, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class WorkOut(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    music = models.FileField(upload_to='', max_length=100, blank=True, null=True)
    lang = models.ForeignKey(Language, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class Classic(models.Model):
    name = models.CharField(max_length=50, blank=False, null=False)
    music = models.FileField(upload_to='', max_length=100, blank=True, null=True)
    lang = models.ForeignKey(Language, on_delete=models.CASCADE)


    def __str__(self):
        return self.name

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    classic = models.ManyToManyField(Classic, blank=True, null=True)
    workOut = models.ManyToManyField(WorkOut, blank=True, null=True)
    chillOut = models.ManyToManyField(ChillOut, blank=True, null=True)
    romantic = models.ManyToManyField(Romantic, blank=True, null=True)
    happy = models.ManyToManyField(Happy, blank=True, null=True)
    sad = models.ManyToManyField(Sad, blank=True, null=True)

    def __str__(self):
        return str(self.user)


# class Favorite(models.Model):
#     name = models.CharField(max_length=50, blank=False, null=False)
#     fav = models.ForeignKey(ChillOut, on_delete=models.CASCADE)
#     pro = models.ForeignKey(Profile, on_delete=models.CASCADE)

#     def __str__(self):
#         return self.name






def update_user_profile(sender, **kwargs):
    if kwargs['created']:
        user = Profile.objects.create(user=kwargs['instance'])

post_save.connect(update_user_profile,sender=User)
0 голосов
/ 04 апреля 2020

Перед добавлением каких-либо объектов в отношение многие-ко-многим обе стороны объекта многие-ко-многим должны получить свои id, поэтому их следует сначала сохранить. Другая проблема в этом коде заключается в том, что вам нужно создать объект Classic, прежде чем добавлять его к выбранным. Метод add принимает объекты, а не параметры конструктора модели.

Может вам помочь следующий пример кода:

pro, _ = Profile.objects.get_or_create(user=request.user)
your_classic = Classic.objects.create(name='Frank Sinatra-i love you baby')
pro.classic.add(your_classic)
...