当我使用外键时,为什么Django会抛出“以int()为基数为10的无效文字”错误?

时间:2018-08-12 06:14:16

标签: python django postgresql

我需要在Django中构建一个具有特定属性(尤其是个人资料图片)的用户模型。

每个用户都属于一个特定的组,每个用户都有各自的对话历史记录。

下面是会话模型和组(上下文)模型

class Conversation(models.Model):
    timestamp = models.DateTimeField(auto_now=True)
    context_name = models.CharField(null=False,max_length=100)
    user = models.CharField(max_length=255, null=False)
    data = models.TextField(null=False)

class Contexts(models.Model):
    context_name = models.CharField(max_length=50)
    context_description = models.TextField()
    users = models.CharField(max_length=255, null=False)

def getUserImagePath(instance,filename):
    return "/kriktona/static/%s_%s"% (str(time()).replace('.','_'),filename)

class UserProperty(models.Model):
    username = models.CharField(max_length=255, null=False)
    pic = models.ImageField(upload_to=getUserImagePath, default="/kriktona/static/images/user.png" ,null=True)
    org = models.CharField(max_length=255, null=False)

如您所见,在Conversation模型中,user只是一个字段,我将根据特定用户在Contexts模型中使用{{1 }}就是我传入用户并对其进行过滤的字段。因此,我得到了用户所属的组(上下文)。

此设置工作正常,但现在我需要声明一个单独的用户模型,该模型将具有自己的名称和图片。

对于users模型,我不需要做任何事情,因为我只需要通过用户名过滤对话即可。

所以我做类似的事情

Conversation

但是对于Conversation.objects.filter( user=user_request.get("user")).filter(context_name=user_request.get("context_name")) ,我需要使用个人资料图片显示属于该特定上下文的用户(就像在Facebook组中一样)。

所以我在Contexts中定义了UserProperty模型

model.py

然后相应地更改class UserProperty(models.Model): username = models.CharField(max_length=255, null=False) pic = models.ImageField(upload_to=getUserImagePath, default="/static/images/user.png" ,null=True) org = models.CharField(max_length=255, null=False) 字段

Contexts

我也对postgres表进行了适当的更改。

下面是UserProperty表( webhook_userproperty

class Contexts(models.Model):
    context_name = models.CharField(max_length=50)
    context_description = models.TextField()
    users = models.ForeignKey(UserProperty , related_name='context_users')

下面是 Column | Type | Modifiers ----------+------------------------+----------- id | integer | username | character varying(100) | pic | bytea | org | character varying(100) | Indexes: "webhook_userproperty_username_key" UNIQUE CONSTRAINT, btree (username) Referenced by: TABLE "webhook_contexts" CONSTRAINT "webhook_contexts_users_fkey" FOREIGN KEY (users) REFERENCES webhook_userproperty(username) ON UPDATE CASCADE ON DELETE CASCADE 表(webhook_contexts)

Contexts

但是当页面加载时出现以下错误

       Column        |          Type          | Modifiers 
---------------------+------------------------+-----------
 id                  | integer                | 
 context_name        | character varying(100) | 
 context_description | character varying(100) | 
 users               | text                   | 
Foreign-key constraints:
    "webhook_contexts_users_fkey" FOREIGN KEY (users) REFERENCES webhook_userproperty(username) ON UPDATE CASCADE ON DELETE CASCADE

我不知道为什么会收到此错误。当我不必定义任何用户模型时,它可以正常工作,但是尽管我在ERROR 2018-08-12 10:22:13,585 django.request Internal Server Error: /api/contexts Traceback (most recent call last): File "/usr/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner response = get_response(request) File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response response = self._get_response(request) File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response response = self.process_exception_by_middleware(e, request) File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/usr/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view return view_func(*args, **kwargs) File "/home/ec2-user/webhook/ui_server.py", line 279, in get_contexts queryset = serializers.serialize("json", Contexts.objects.filter(users=user_request.get("user"))) File "/usr/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 782, in filter return self._filter_or_exclude(False, *args, **kwargs) File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 800, in _filter_or_exclude clone.query.add_q(Q(*args, **kwargs)) File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1261, in add_q clause, _ = self._add_q(q_object, self.used_aliases) File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1287, in _add_q allow_joins=allow_joins, split_subq=split_subq, File "/usr/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1217, in build_filter condition = lookup_class(lhs, value) File "/usr/lib/python2.7/site-packages/django/db/models/lookups.py", line 24, in __init__ self.rhs = self.get_prep_lookup() File "/usr/lib/python2.7/site-packages/django/db/models/fields/related_lookups.py", line 112, in get_prep_lookup self.rhs = target_field.get_prep_value(self.rhs) File "/usr/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 962, in get_prep_value return int(value) ValueError: invalid literal for int() with base 10: 'test@email.com 文件中进行了必要的更改,但现在它抛出了错误和postgres表。

我认为它必须与定义外键的方式有关。我在做什么错?

编辑

这是我显示上下文(组)的功能

models.py

更新

当前我收到如下错误

@csrf_exempt
def get_contexts(request):
    user_request = request.GET
    queryset = serializers.serialize("json", Contexts.objects.filter(users=user_request.get("user")))
    return HttpResponse(json.dumps([i.get('fields') for i in json.loads(queryset)]))

我认为问题可能是我创建ProgrammingError: column webhook_contexts.users_id does not exist LINE 1: ...k_contexts" INNER JOIN "webhook_userproperty" ON ("webhook_c... 的方式。这就是我在postgres中创建表的方式

webhook_userproperty

在这里,我将CREATE TABLE webhook_userproperty(id integer, username character varying(100) unique, pic bytea, org character varying(100)); 分配给unique是因为我是通过外键将其引用到表webhook_contexts的。但是,一旦创建它,​​就会收到以下警告

username

然后我通过以下查询创建NOTICE: CREATE TABLE / UNIQUE will create implicit index "webhook_userproperty_username_key" for table "webhook_userproperty"

webhook_contexts

不确定警告是否可能是导致此错误的原因。

2 个答案:

答案 0 :(得分:0)

我认为问题出在 lookup-expression 。 在过滤器中使用 users__username 代替 users

Contexts.objects.filter(users__username=user_request.get("user"))

默认情况下,users 期望 PK ,即整数

我尝试过的事情
查看功能

@csrf_exempt
def get_contexts(request):
    queryset = Contexts.objects.all()  # if there is no request param in URL
    if 'users' in request.GET and request.GET['users']:

模型,

class UserProperty(models.Model):
    username = models.CharField(max_length=255, null=False)
    pic = models.ImageField(upload_to=getUserImagePath, default="/static/images/user.png" ,null=True)
    org = models.CharField(max_length=255, null=False)


class Contexts(models.Model):
    context_name = models.CharField(max_length=50)
    context_description = models.TextField()
    users = models.ForeignKey(UserProperty, related_name='context_users')

requested_url:/sample/end/point/?users=sample@mail.com

答案 1 :(得分:0)

首先ForeignKey的名称应为单数,在Contexts模型中,请将users更改为user,而related_name应为{ {1}}

contexts

如果您是获取用户名的用户,则获取所有上下文,如

class Contexts(models.Model):
    context_name = models.CharField(max_length=50)
    context_description = models.TextField()
    user = models.ForeignKey(UserProperty , related_name='contexts')  # <- user