【问题标题】:ManyToMany relationship in django modelsDjango 模型中的多对多关系
【发布时间】:2018-01-04 20:07:31
【问题描述】:

我正在尝试添加具有 manyToMany 关系的三个表之间的关系。我正在学习 python 和新的 Django 框架。对于需求,用户可以添加项目,也可以添加其他用户的查看权限。 这意味着一个用户可以有多个项目,一个项目也可以有多个用户。 用户模型是django的默认用户模型。

项目模型为:

项目/model.py

from django.db import models
from django.contrib.auth.models import User
# Create your models here.


class Projects(models.Model):
    project_title = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    privacy = models.SmallIntegerField(default=1) # 1 for public, 2 for private
    status = models.SmallIntegerField(default=1) #1 for active, 2 for deactive, 3 for delete, 4 for depricated
    created_at = models.DateTimeField('date published', blank=True, default=False)
    users = models.ManyToManyField(User, through="UserProjects")

class UserProjects(models.Model):
    user = models.ForeignKey(User,blank=True, default=False)
    project = models.ForeignKey(Projects,blank=True)
    owner = models.SmallIntegerField(default=1)

它不工作。 当我添加一个项目时会产生一些错误..

Traceback (most recent call last):
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\core\handlers\exception.py", line 41, in inner
    response = get_response(request)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\core\handlers\base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\core\handlers\base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "E:\Programs\Python\RestClient\Projects\views.py", line 29, in add
    p.save()
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\base.py", line 806, in save
    force_update=force_update, update_fields=update_fields)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\base.py", line 836, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, upda
te_fields)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\base.py", line 922, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\base.py", line 961, in _do_insert
    using=using, raw=raw)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\query.py", line 1063, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\sql\compiler.py", line 1098, in execute_sql
    for sql, params in self.as_sql():
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\sql\compiler.py", line 1051, in as_sql
    for obj in self.query.objs
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\sql\compiler.py", line 1051, in <listcomp>
    for obj in self.query.objs
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\sql\compiler.py", line 1050, in <listcomp>
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in field
s]
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\sql\compiler.py", line 990, in prepare_value
    value = field.get_db_prep_save(value, connection=self.connection)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\fields\__init__.py", line 770, in get_db_prep_save
    prepared=False)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\fields\__init__.py", line 1459, in get_db_prep_value
    value = self.get_prep_value(value)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\fields\__init__.py", line 1438, in get_prep_value
    value = super(DateTimeField, self).get_prep_value(value)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\fields\__init__.py", line 1296, in get_prep_value
    return self.to_python(value)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\db\models\fields\__init__.py", line 1399, in to_python
    parsed = parse_datetime(value)
  File "C:\Users\Jitendra\AppData\Local\Programs\Python\Python35-32\lib\site-pac
kages\django\utils\dateparse.py", line 94, in parse_datetime
    match = datetime_re.match(value)
TypeError: expected string or bytes-like object
[28/Jul/2017 22:25:10] "POST /projects/add/ HTTP/1.1" 500 145532

这里是projects/view.py

def add(request):
    form = ProjectForm()
    if request.method == "POST":
        form = ProjectForm(request.POST)
        if form.is_valid():
            p = Projects(project_title=request.POST.get("project_title"), description=request.POST.get("description"),
                         status=1, privacy=1)
            p.save()
            sp = UserProjects(user_id=request.user.id, project_id=p.id)
            sp.save()
            p.users.add(sp)
            messages.success(request, 'Profile details updated.')

    view_data = {
        "form": form,
        'title': "Add new project"
    }
    return render(request, 'projects/add.html', view_data)

我不知道,有什么问题。请指导我。谢谢

【问题讨论】:

  • 错误似乎出现在 DateTimeField 中,如果您只想知道创建对象的时间,请尝试:models.DateTimeField(auto_now_add=True, db_index=True)。这将在创建对象时自动添加当前日期和时间
  • 感谢您的指导,但现在它产生另一个错误:不能在指定中间模型的 ManyToManyField 上使用 add()。改用 Projects.UserProjects 的 Manager。
  • p.users.add(sp) 这不是必需的,因为您已经使用“通过”方法在模型本身中分配了它docs.djangoproject.com/en/dev/topics/db/models/…
  • 谢谢。它终于起作用了。 :) 还请指导用户如何获取这些项目?
  • 我在上面发布的相同链接向您展示了如果您向下滚动到下一个示例,如何访问和分配

标签: python mysql django django-models


【解决方案1】:

来自Django docs

类 DateTimeField(**kwargs)

默认小部件:DateTimeInput

空值:无

规范化为:Python datetime.datetime 对象。

验证给定值是 datetime.datetime、datetime.date 还是以特定日期时间格式格式化的字符串。

错误消息键:必需,无效

您可以读到 DateTimeField 验证给定值是 datetime.datetime、datetime.date 还是以特定日期时间格式格式化的字符串,但是您在模型定义中设置了 default=False。所以我猜问题出在那儿。

【讨论】:

    猜你喜欢
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2015-02-03
    • 2012-12-04
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多