我需要在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
不确定警告是否可能是导致此错误的原因。
答案 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