使用设置为CharField的外键创建模型实例

时间:2015-12-01 20:33:02

标签: django python-3.x django-models

我正在使用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) 

1 个答案:

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