Django model.save() 不写入数据库
Posted
技术标签:
【中文标题】Django model.save() 不写入数据库【英文标题】:Django model.save() not writing to database 【发布时间】:2012-06-30 08:43:28 【问题描述】:我是 Django 新手,只是尝试使用 ModelForms 提交表单以创建新事件并将其保存到数据库中。
我正在尝试将行插入三个表中:Location、Event(具有 location_id FK)和 EventSchedule(作为 event_id FK)。
这是保存表单的方法。调用时不返回错误,但新行并没有插入到数据库中。:
addNewEvent()(在views.py中)
def addNewEvent(self, event_form, location_form, event_sched_form, latitude, longitude):
new_event = event_form.save(commit=False)
new_location = location_form.save(commit=False)
new_event_sched = event_sched_form.save(commit=False)
# set any necessary values and save forms
new_location.latitude = latitude
new_location.longitude = longitude
new_location.save()
new_event.flagged = False
new_event.location = new_location
new_event.save()
new_event_sched.event = new_event
new_event_sched.save()
models.py
class Location(models.Model):
name = models.CharField(max_length=200)
#address = models.CharField(max_length=200)
city = models.CharField(max_length=200)
state_code = models.CharField(max_length=100)
zip = models.CharField(max_length=100, blank=True)
country = models.CharField(max_length=100)
latitude = models.DecimalField(max_digits=9, decimal_places=6)
longitude = models.DecimalField(max_digits=9, decimal_places=6)
class Meta:
db_table = 'location'
class Event(models.Model):
CATEGORIES = (
('KID', 'Kids'),
('FAM', 'Family'),
('NIT', 'Nightlife'),
('OUT', 'Outdoors'),
('ART', 'Arts'),
('MSC', 'Music'),
('SPT', 'Sports'),
('SAL', 'Sale'),
('EDU', 'Educational'),
('POL', 'Political'),
('FOD', 'Food'),
('OTH', 'Other')
)
location = models.ForeignKey(Location)
name = models.CharField(max_length=200)
description = models.CharField(max_length=200)
category = models.CharField(max_length=20, choices=CATEGORIES)
age_req = models.IntegerField(null=True)
cost_per_person = models.DecimalField(max_digits=5, decimal_places=2, null=True)
flagged = models.BooleanField()
users = models.ManyToManyField(User, through='UserEvent')
class Meta:
db_table = 'event'
class EventSchedule(models.Model):
event = models.ForeignKey(Event)
start_date_time = models.DateTimeField()
end_date_time = models.DateTimeField()
class Meta:
db_table = 'event_schedule'
forms.py
从 django.forms 导入 ModelForm,表单 从模型导入 Event、Location、EventSchedule
class EventForm(ModelForm):
class Meta:
model = Event
fields = ('name','description','category','age_req','cost_per_person')
class LocationForm(ModelForm):
class Meta:
model = Location
fields = ('name','city','state_code','zip','country')
class EventScheduleForm(ModelForm):
class Meta:
model = EventSchedule
fields = ('start_date_time', 'end_date_time')
非常感谢任何帮助。
谢谢,
彼得
编辑:
我什至无法保存模型,更不用说 ModelForm(即使我在其他地方成功地做到了)。我添加了以下代码以将用户与事件相关联。没有错误,但它不会在数据库中添加一行:
new_user_event = UserEvent(user=user,
event=new_event,
datetime_created=datetime.datetime.now())
new_user_event.save()
有什么想法吗?
编辑 2:
new_user_event 的截图:http://imgur.com/JUauG
编辑 3:
这就是我实例化 ModelForms 的方式:
event_form = EventForm(request.POST or None)
location_form = LocationForm(request.POST or None)
event_sched_form = EventScheduleForm(request.POST or None)
【问题讨论】:
【参考方案1】:哇,我真是个白痴。由于某些代码用虚拟数据填充数据库,我在实际显示事件之前删除了表中的行。
我可以删除这个问题还是应该继续作为我愚蠢的证明?
【讨论】:
如果它让你感觉更好,这个问题/答案帮助我们在我们的 Jenkins 服务器上调试了类似的情况。所以你的回答至少帮助了一个人!【参考方案2】:https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method
commit=false
是原因
【讨论】:
但是我在使用 commit=False 进行初始保存后保存了它(即 new_location.save())......这实际上不是保存它吗?【参考方案3】:您没有在此处发布最重要的部分 IHMO:您的表单是如何实例化的? ModelForm 可用于创建新实例或更新现有实例。如果您将现有实例传递给表单,那么您的代码只会更新它们。
【讨论】:
哦!好吧,我目前无法访问代码,但我想我是这样做的:event_form = EventForm(request.POST or None)
以上是关于Django model.save() 不写入数据库的主要内容,如果未能解决你的问题,请参考以下文章
Django 在“model.save()”之后不更新 HTML 模板
Cakephp 的 beforeSave() 不使用 $model::save() 保留新数据
在 model.save 或 model.save 中捕获数据库异常!方法?
使用 Cakephp model::save() 将数据保存到不同的数据库表