如何使用 Django 更新 table 列?
How do I update a table column with Django?
我正在尝试创建一个带有表单的应用程序,该表单在提交时会根据提交的信息在我的数据库中更新 table,但我不确定如何去做。目前,我有一个简单的模式:
class Client(models.Model):
company_name = models.CharField(max_length=200)
launchpad_id = models.PositiveIntegerField()
client_email = models.EmailField()
content_id = models.CharField(max_length=200)
def __str__(self):
return self.company_name + ' | ' + self.content_id
我的数据库配置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_project',
'USER': 'xxx',
'PASSWORD': 'xxx',
'HOST': 'xxxx',
'PORT': 'xxx',
},
'info': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'reporting_database',
'USER': 'xxx',
'PASSWORD': 'xxx',
'HOST': 'xxx',
'PORT': 'xxx',
}
}
我想要发生的是,当我在管理或模板中通过客户端模型提交我的字段时,它会在 reporting_database 中更新我的 client_info table。我似乎无法弄清楚如何使该连接正常工作。如果您能给我任何指示,我将不胜感激。谢谢
您需要一个可以创建或更新模型的函数。你可以按照 django 文档:
https://docs.djangoproject.com/en/2.1/ref/models/instances/
使用模型表格:
from your_app import Client
class ClientUpdateForm(forms.ModelForm):
class Meta:
model = Client
fields = ('company_name', 'launchpad_id', 'client_email', 'content_id')
def __init__(self, *args, **kwargs):
super(ClientUpdateForm, self).__init__(*args, **kwargs)
self.fields['company_name'].required = True
self.fields['launchpad_id'].required = True
self.fields['client_email'].required = True
self.fields['content_id'].required = True
def clean(self):
cleaned_data = super(ClientUpdateForm, self).clean()
company_name = cleaned_data.get('company_name')
launchpad_id = cleaned_data.get('launchpad_id')
client_email = cleaned_data.get('client_email')
content_id = cleaned_data.get('content_id')
然后继承自UpdateView:
from django.views.generic import UpdateView
from your_app import Client
class ClientUpdateForm(UpdateView):
model = Client
form_class = ClientUpdateForm
template_name_suffix = '_update_form'
def form_valid(self, form):
if form.is_valid():
client = form.save(commit=False)
client.save()
return HttpResponseRedirect('/redirect/')
template_name_suffix 意味着您应该在呈现表单的位置调用模板 client_update_form.html。
我想你需要一个 database_router 来完成这个。坚持https://docs.djangoproject.com/en/2.1/topics/db/multi-db/。基本上,您需要设置一个 DatabaseRouter,您可以在其中设置将从哪个数据库读取模型 table ecc。然后在 django 设置中设置自定义数据库路由。你可能需要运行迁移这个模型,像这样./manage.py migrate myapp 0005_migration_to_run --databse=your_target_databse_name,我可能会建议你有不同的每个数据库项目内的应用程序,使它更容易。
通过将以下代码添加到我的模型中,我能够实现我想要的结果:
def update_mysql(self):
cursor = db.cursor()
sql = "UPDATE tb_reporting_info SET client_email = '%s' WHERE content_id = '%s' AND launchpad_id = '%s';"
cursor.execute( sql % (self.client_email, self.content_id, self.launchpad_id))
db.commit()
我将表单操作设置为 action="{% url 'contact:addClient' %}"
,将视图设置为:
def addClient(request):
if request.method == 'POST':
# Set POST data to variables
company_name = request.POST['company_name']
launchpad_id = request.POST['launchpad_id']
content_id = request.POST['content_id']
client_email = request.POST['client_email']
client_added = True # Tells the template to render a success message
# Pass POST data to Client object
c = Client(company_name = company_name,
launchpad_id = launchpad_id,
content_id = content_id,
client_email = client_email
)
c.update_mysql()
它很简陋,但非常适合我的需要。
我正在尝试创建一个带有表单的应用程序,该表单在提交时会根据提交的信息在我的数据库中更新 table,但我不确定如何去做。目前,我有一个简单的模式:
class Client(models.Model):
company_name = models.CharField(max_length=200)
launchpad_id = models.PositiveIntegerField()
client_email = models.EmailField()
content_id = models.CharField(max_length=200)
def __str__(self):
return self.company_name + ' | ' + self.content_id
我的数据库配置如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_project',
'USER': 'xxx',
'PASSWORD': 'xxx',
'HOST': 'xxxx',
'PORT': 'xxx',
},
'info': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'reporting_database',
'USER': 'xxx',
'PASSWORD': 'xxx',
'HOST': 'xxx',
'PORT': 'xxx',
}
}
我想要发生的是,当我在管理或模板中通过客户端模型提交我的字段时,它会在 reporting_database 中更新我的 client_info table。我似乎无法弄清楚如何使该连接正常工作。如果您能给我任何指示,我将不胜感激。谢谢
您需要一个可以创建或更新模型的函数。你可以按照 django 文档: https://docs.djangoproject.com/en/2.1/ref/models/instances/
使用模型表格:
from your_app import Client
class ClientUpdateForm(forms.ModelForm):
class Meta:
model = Client
fields = ('company_name', 'launchpad_id', 'client_email', 'content_id')
def __init__(self, *args, **kwargs):
super(ClientUpdateForm, self).__init__(*args, **kwargs)
self.fields['company_name'].required = True
self.fields['launchpad_id'].required = True
self.fields['client_email'].required = True
self.fields['content_id'].required = True
def clean(self):
cleaned_data = super(ClientUpdateForm, self).clean()
company_name = cleaned_data.get('company_name')
launchpad_id = cleaned_data.get('launchpad_id')
client_email = cleaned_data.get('client_email')
content_id = cleaned_data.get('content_id')
然后继承自UpdateView:
from django.views.generic import UpdateView
from your_app import Client
class ClientUpdateForm(UpdateView):
model = Client
form_class = ClientUpdateForm
template_name_suffix = '_update_form'
def form_valid(self, form):
if form.is_valid():
client = form.save(commit=False)
client.save()
return HttpResponseRedirect('/redirect/')
template_name_suffix 意味着您应该在呈现表单的位置调用模板 client_update_form.html。
我想你需要一个 database_router 来完成这个。坚持https://docs.djangoproject.com/en/2.1/topics/db/multi-db/。基本上,您需要设置一个 DatabaseRouter,您可以在其中设置将从哪个数据库读取模型 table ecc。然后在 django 设置中设置自定义数据库路由。你可能需要运行迁移这个模型,像这样./manage.py migrate myapp 0005_migration_to_run --databse=your_target_databse_name,我可能会建议你有不同的每个数据库项目内的应用程序,使它更容易。
通过将以下代码添加到我的模型中,我能够实现我想要的结果:
def update_mysql(self):
cursor = db.cursor()
sql = "UPDATE tb_reporting_info SET client_email = '%s' WHERE content_id = '%s' AND launchpad_id = '%s';"
cursor.execute( sql % (self.client_email, self.content_id, self.launchpad_id))
db.commit()
我将表单操作设置为 action="{% url 'contact:addClient' %}"
,将视图设置为:
def addClient(request):
if request.method == 'POST':
# Set POST data to variables
company_name = request.POST['company_name']
launchpad_id = request.POST['launchpad_id']
content_id = request.POST['content_id']
client_email = request.POST['client_email']
client_added = True # Tells the template to render a success message
# Pass POST data to Client object
c = Client(company_name = company_name,
launchpad_id = launchpad_id,
content_id = content_id,
client_email = client_email
)
c.update_mysql()
它很简陋,但非常适合我的需要。