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
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
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
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