简体   繁体   English

Django模型中的ManyToMany关系

[英]ManyToMany relationship in django models

I'm trying to add relation between three table with manyToMany relationship. 我试图在与manyToMany关系的三个表之间添加关系。 I'm learning python and new for Django framework. 我正在学习python和Django框架的新知识。 For requirement, An user can add a project and he also can add permission for view for another user. 根据要求,用户可以添加项目,还可以为另一个用户添加查看权限。 It means an user can have multiple projects and a project also have multiple user. 这意味着一个用户可以有多个项目,而一个项目也可以有多个用户。 User model is default user model of django. 用户模型是django的默认用户模型。

and the project model is: 项目模型为:

Projects/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)

It's not working. 没用 When i'm add a project is produce some error.. 当我添加一个项目时会产生一些错误。

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

And here the projects/view.py 这是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)

I dont know, whats wrong with it. 我不知道,这怎么了。 Please guide me. 请指导我。 Thanks 谢谢

From Django docs : 来自Django文档

class DateTimeField(**kwargs) 类DateTimeField(** kwargs)

Default widget: DateTimeInput 默认小部件:DateTimeInput

Empty value: None 空值:无

Normalizes to: A Python datetime.datetime object. 规范化为:Python datetime.datetime对象。

Validates that the given value is either a datetime.datetime, datetime.date or string formatted in a particular datetime format. 验证给定的值是datetime.datetime,datetime.date还是以特定datetime格式格式化的字符串。

Error message keys: required, invalid 错误消息键:必填,无效

You can read that DateTimeField validates that given value is either datetime.datetime, datetime.date or string formatted in particular datetime format, however you set default=False in your model definitions. 您可以看到DateTimeField验证给定的值是datetime.datetime,datetime.date还是以特定datetime格式格式化的字符串,但是您在模型定义中设置了default=False So I would guess the problem lays in there. 所以我想问题就在那儿。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM