我正在使用Django 1.8并试图像这样创建一个新的Tweet实例:
user_instance = User.objects.get(screen_name="KalleAnka") # exists
t = Tweet.objects.get_or_create(from_user_id=user_instance)
t.text = "hullabaloo my friend!"
t.to_user = "KajsaAnka"
t.save()
我的models.py:
class User(models.Model):
screen_name = models.CharField(max_length=100, unique=True)
token_count = models.IntegerField(null=True)
class Tweet(models.Model):
text = models.CharField(max_length=255)
from_user = models.ForeignKey('User', to_field="screen_name")
to_user = models.CharField(max_length=100)
但是,我收到以下错误消息:
FieldError: Cannot resolve keyword 'from_user_id' into field. Choices are: from_user, id, text, to_user
如果我使用此方法创建新的推文实例(已删除_id):
t = Tweet.objects.get_or_create(from_user=user_instance)
它抱怨数据库中没有这样的列:
OperationalError: no such column: tweets_tweet.from_user
如果我改为使用双下划线(__id)
t = Tweet.objects.get_or_create(from_user__id=user_instance)
我收到以下错误:
FieldError: Unsupported lookup 'id' for CharField or join on the field not permitted.
我还尝试在创建新的Tweet实例时将.id放在user_instance上,没有运气(并运行迁移):
我已经阅读了至少10个不同的类似问题,当然还有the docs,但我无法弄清楚为什么它不能像这样工作。
解决方案:在创建Tweet实例时,我必须解压缩“created”值:
t, **created** = Tweet.objects.get_or_create(from_user_id=user_instance)
答案 0 :(得分:1)
你只需要:
user = "KalleAnka" # exist as instance if User
t, created = Tweet.objects.get_or_create(from_user=user)
t.text = "hullabaloo my friend!"
t.to_user = "KajsaAnka"
t.save()
执行ORM调用时,总是为ForeignKey字段传递模型实例。
我在:https://www.dropbox.com/s/z6pb4rbz0iyol21/tweets_app.zip?dl=0
制作了一个示例项目我稍微调整了你的模型代码,不要与Django的用户模型发生碰撞,这是我得到的结果:
>>> from tweets.models import Tweet, TwitterUser
>>> twitter_user = TwitterUser.objects.get(screen_name='KalleAnka')
>>> t, created = Tweet.objects.get_or_create(from_user=twitter_user)
>>> t.text = "hullabaloo my friend!"
>>> t.to_user = "KajsaAnka"
>>> t.save()
>>> t
<Tweet: Tweet object>
>>> t.from_user
<TwitterUser: TwitterUser object>