我有一个 Django 项目,它基本上由 3 个数据集组成:(auth User
加上一个Profile
数据集),mem_ev
并且--< >-- ,Events
即经典的多对多关系,使得成员可以参加许多活动,并且许多成员可以访问一个活动。User
mem_ev
Event
我想mem_ev
用成员选择的‘要参加的活动’来更新数据集,但是它不起作用。
我的models.py
文件是:
from django.db import models
from django.utils.text import slugify
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE) # Delete profile when user is deleted
event_count = models.IntegerField(default=0)
def __str__(self):
return f'{self.user.username} Profile' #show how we want it to be displayed
class Event(models.Model):
title = models.CharField(max_length=50)
slug = models.SlugField(max_length=50,default="", null=False)
description = models.TextField()
cost = models.DecimalField(max_digits = 5, decimal_places = 2, default = 0.0)
event_date = models.DateTimeField(null=True,blank=True)
attendees = models.IntegerField(default=0)
class Meta:
ordering = ['event_date']
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Event, self).save(*args, **kwargs)
class Meta:
ordering = ['event_date']
def __str__(self):
return self.title
class mem_ev(models.Model):
member_id = models.ForeignKey("Profile",on_delete=models.CASCADE)
event_id = models.ForeignKey("Event",on_delete=models.CASCADE)
is_attending = models.BooleanField(default=False)
amt_paid = models.DecimalField(max_digits = 5, decimal_places = 2, default = 0.0)
date_paid = models.DateTimeField(null=True,blank=True)
我的文件的相关部分views.py
是:
from django.contrib.auth.models import User
from .models import Event, mem_ev, Profile
from django.contrib.auth import get_user_model
...
def selected_events(request):
user = request.user
member = Profile.objects.get(user_id=user.id)
print(f'Member id = {member.id}')
deletes = mem_ev.objects.filter(member_id=member.id)
deletes.delete()
for event in request.POST.getlist('events'):
e = mem_ev(member_id=member.id,event_id=event) <==== this is the bit Django doesn't like
e.save()
messages.success(request, 'Your Event Selections have been updated')
return render(request, 'wf/about.html')
我收到的错误是:
ValueError at /selected-events/
Cannot assign "14": "mem_ev.member_id" must be a "Profile" instance.
...
/home/dconran/django/mysite/wf/views.py, line 112, in selected_events
e = mem_ev(member_id=member.id,event_id=event)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
“14”是用户个人资料user_id
,与我使用管理站点添加记录时相同。我尝试将第 112 行更改为,views.py
但e = mem_ev(profile__member_id=member.id,event_id=event)
仍然出现错误。
我做错什么了?
要解决您的问题,您需要传递一个实例
Profile
作为member_id
值:还有另一种方法可以解决您的问题。摘自文档:
这意味着您可以像这样设置相关对象:
当您不需要从数据库检索相关模型实例但知道其主键时,此选项通常是更好的选择。
同样的道理
event_id=event
,如果event
是主键,则使用:e = mem_ev(member_id_id=member.id, event_id_id=event)
。