2017-10-14 6 views
0

utilisateur/models.pyDjango - relation entre ManyToMany User.Profile et un autre modèle, ValueError: Impossible d'ajouter

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


class Bread(models.Model): 
    title = models.CharField(max_length=40) 

    def __str__(self): 
     return self.title 


class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    bio = models.TextField(max_length=500, blank=True) 
    location = models.CharField(max_length=30, blank=True) 
    birth_date = models.DateField(null=True, blank=True) 
    picture = models.ImageField(upload_to="photos/", default="photos/none/default.png") 
    bread = models.ManyToManyField(Bread) 


@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.create(user=instance) 


@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 

J'essaie d'ajouter un objet simple modèle de profil, mais il ne fonctionne pas.

>>> from user.models import Bread 
>>> from user.models import Profile 
>>> from django.contrib.auth.models import User 
>>> p1 = Bread(title="Example") 
>>> p1.save() 
>>> Profile(User).bread.add(p1) 
ValueError: Cannot add "<Bread: Example>": instance is on database "None", value is on database "default" 
>>> u1 = Profile(User) 
>>> u1.save() 
TypeError: _prepare() takes 1 positional argument but 2 were given 

Voir des questions similaires précédentes, j'ai essayé de sauver le modèle de profil, comme u peut voir, je sais que lié avec l'utilisateur et sa carte d'identité, mais je ne sais pas comment résoudre facilement

Répondre

0

Avez-vous essayé créer complètement un objet Profil et l'enregistrer avant d'y ajouter des instances Pain? Aussi, je remarque que vous passez une classe de modèle à un constructeur de modèle. Vous devriez passer une instance d'un utilisateur. Votre modèle de profil nécessite également d'autres champs.

Je serais assez explicite qu'implicite dans la création comme dans:

u1 = Profile.objects.create(
    user=myuser, 
    bio="blablabla", 
    location="blublublue", 
) 

alors et seulement alors, je voudrais ajouter l'exemple du pain à l'instance Profil

espère qu'il est clair.

0
>>> from api.models import Film 
>>> from user.models import Profile 
>>> from django.contrib.auth.models import User 
>>> from django.shortcuts import render, redirect, get_object_or_404 
>>> user = get_object_or_404(Profile) 
>>> user 
<Profile: Profile object> 
>>> lobster = get_object_or_404(Film, id=22) 
>>> lobster 
<Film: Lobster> 
>>> a = user.film.add(lobster) 
>>> another_movie = get_object_or_404(Film, id=23) 
>>> another_movie 
<Film: What I actually do> 
>>> user.film.add(another_movie) 
>>> film = bloader.film.all() 
>>> film 
<QuerySet [<Film: Lobster>, <Film: What I actually do>]> 
>>> 

J'ai essayé comme ceci et son fonctionne, merci @efkin.