2017-07-28 3 views
1

Ich versuche, Beziehung zwischen drei Tabelle mit manyToMany Beziehung hinzuzufügen. Ich lerne Python und neu für Django Framework. Bei Bedarf kann ein Benutzer ein Projekt hinzufügen, und er kann auch Berechtigungen für die Ansicht für einen anderen Benutzer hinzufügen. Dies bedeutet, dass ein Benutzer mehrere Projekte haben kann und ein Projekt auch mehrere Benutzer haben kann. Benutzermodell ist das Standardbenutzermodell von django.ManyToMany-Beziehung in Django-Modellen

und das Projektmodell ist:

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

Es funktioniert nicht. Wenn ich ein Projekt hinzufügen bin, ist, einige Fehler produzieren ..

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 

Und hier die 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) 

Ich weiß nicht, was ist falsch mit ihm. Bitte führen Sie mich. Dank

+0

Der Fehler scheint in DateTimeField zu sein, wenn Sie nur wissen möchten, wann das Objekt erstellt wurde try: models.DateTimeField (auto_now_add = True, db_index = True). Dies fügt automatisch das aktuelle Datum und die Uhrzeit hinzu, wenn ein Objekt erstellt wird. – martinB0103

+0

Danke für die Anleitung, aber jetzt erzeugt es einen weiteren Fehler: Kann add() nicht für ein ManyToManyField verwenden, das ein intermediäres Modell angibt. Verwenden Sie stattdessen den Manager von Projects.UserProjects. – Jitendra

+1

p.users.add (sp) Dies ist nicht erforderlich, da Sie es bereits im Modell selbst mit der "through" -Methode https://docs.djangoproject.com/en/dev/topics/db/models/# zugewiesen haben. intermediate-manytomany – martinB0103

Antwort

0

Von Django docs:

Klasse Datetimefield (** kwargs)

Standard Widget: DateTimeInput

leeren Wert: Keine

Normalisiert auf: Ein Python Datetime. Datum-Zeit-Objekt.

Überprüft, ob der angegebene Wert entweder eine datetime.datetime, datetime.date oder eine in einem bestimmten datetime-Format formatierte Zeichenfolge ist.

Fehlermeldung Schlüssel erforderlich, ungültige

können Sie lesen, dass Datetimefield bestätigt, dass gegebenen Wert ist entweder datetime.datetime, datetime.date oder String insbesondere Datetime-Format formatiert, aber Sie default=False in Ihrem Modell festgelegt Definitionen. Ich denke also, das Problem liegt darin.