2017-10-14 38 views
0

用戶/ models.pyDjango的 - User.Profile和另一種模式,ValueError異常之間的多對多關係:不能添加

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() 

我嘗試添加一個簡單的對象剖面模型,但它不工作。

>>> 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 

看到我試圖挽救剖面模型類似前面的問題,就像你看到的,我知道它與用戶和他的ID相關的,但我不知道如何來解決它

回答

0

你有沒有嘗試完全創建一個Profile對象並在添加Bread實例之前保存它? 另外我注意到你正在將模型類傳遞給模型構造函數。你應該傳遞一個用戶的實例。 此外,您的個人資料模型還需要其他一些字段。

我會比隱而不顯式創建它作爲:

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

那麼只有到那時,我會面包實例添加到配置文件實例

希望很明顯。

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>]> 
>>> 

我試過這樣和它的工作,謝謝@efkin。

相關問題