GVKun编程网logo

django-admin.py dumpdata到SQL语句(django导入mysql)

11

对于django-admin.pydumpdata到SQL语句感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解django导入mysql,并且为您提供关于day82DjangoAdmin组件

对于django-admin.py dumpdata到SQL语句感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解django导入mysql,并且为您提供关于day 82 Django Admin 组件.、Django Admin Cookbook-15 如何在 Django Admin 后台模型列表页面中添加自定义操作按钮、Django Admin Cookbook-16如何使用Django Admin管理后台导入CSV、Django Admin Cookbook-38如何获取特定对象的Django Admin后台URL的宝贵知识。

本文目录一览:

django-admin.py dumpdata到SQL语句(django导入mysql)

django-admin.py dumpdata到SQL语句(django导入mysql)

我正在尝试将数据转储到SQL语句。django-admin.py dumpdata仅提供json,xml,yaml。所以:

  1. 有人知道这样做的好方法吗?

  2. 我尝试过:

def sqldumper(模型):

    result = ""units = model.objects.all().values()for unit in units:    statement = "INSERT INTO myapp.model "+str(tuple(unit.keys())).replace("''", "")+" VALUES " + str(tuple(unit.values()))+"\r\n"    result+=statementreturn result

因此,我自己查看模型的值,然后自己编写INSERT语句。然后我想到了使用“ django-admin.py sql”来获取“
CREATE”语句..但是后来我不知道如何从我的代码内部使用此行(而不是通过命令行)。我尝试了os.popen和os.system,但是它实际上不起作用..关于此的任何提示?

我将明确指出:如何在代码内部使用“ manage.py sql”?

我在我的视图中添加以下内容:

import os, sysimport impfrom django.core.management import execute_managersys_argv_backup = sys.argvimp.find_module("settings")import settingssys.argv = ['''',''sql'',''myapp'']execute_manager(settings)sys.argv = sys_argv_backup

事实是-
它可以工作..但是它会将语句写到标准输出中…这是某种东西,但并不完美。我将尝试直接使用django.core.management.sql.sql_create,我们将看看它如何进行。

谢谢

答案1

小编典典

我建议使用特定于SQL的转储程序(例如,用于MySQL的mysqldump)。

对于嵌入在Python中的sqlite,您可以查看以下示例,该示例不涉及Django:

# Convert file existing_db.db to SQL dump file dump.sqlimport sqlite3, oscon = sqlite3.connect(''existing_db.db'')with open(''dump.sql'', ''w'') as f:    for line in con.iterdump():        f.write(''%s\n'' % line)

day 82 Django Admin 组件.

day 82 Django Admin 组件.

 

一、先建表环境

modules 文件

from django.db import models

# Create your models here.
from django.contrib.auth.models import AbstractUser

class UserInfo(AbstractUser):
    ''''''
    用户表
    ''''''
    nid  =models.AutoField(primary_key=True)
    phone  =models.CharField(max_length=11,null=True,unique=True)
    avatar = models.FileField(upload_to=''avatars/'',default=''avatars/default.png'',verbose_name=''头像'')
    create_time =models.DateTimeField(auto_now_add=True)
    blog =models.OneToOneField(to=''Blog'',to_field=''nid'',null=True)
    def __str__(self):
        return self.username

class Blog(models.Model):
    ''''''
    博客信息
    ''''''
    nid =models.AutoField(primary_key=True)
    title =models.CharField(max_length=64)
    site =models.CharField(max_length=32,unique=True)
    theme =models.CharField(max_length=32)

    def __str__(self):
        return self.title
#

class  Category(models.Model):
    ''''''
    个人博客文章分类
    ''''''
    nid =models.AutoField(primary_key=True)
    title =models.CharField(max_length=32)#分类标题
    blog = models.ForeignKey(to =''Blog'',to_field=''nid'')#外键关联博客,一个博客站点可以有多个分类

    def __str__(self):
        return self.title

class Tag(models.Model):
    ''''''''
    标签
    ''''''
    nid =models.AutoField(primary_key=True)
    title =models.CharField(max_length=32)
    blog =models.ForeignKey(to=''Blog'',to_field=''nid'') #所属博客

    def __str__(self):
        return self.title

class Article(models.Model):
    ''''''
    文章
    ''''''
    nid =models.AutoField(primary_key=True)
    title = models.CharField(max_length=50) #文章标题描述
    desc =models.CharField(max_length=255) #文章描述
    create_time =models.DateTimeField()#创建时间

    category = models.ForeignKey(to =''Category'',to_field=''nid'',null=True)
    user = models.ForeignKey(to=''UserInfo'',to_field=''nid'')
    tags =models.ManyToManyField( # 中介模型
        to =''Tag'',
        through=''Article2Tag'',
        through_fields=(''article'',''tag'')#注意顺序

    )

    def __str__(self):
        return self.title

class ArticleDetail(models.Model):
    ''''''
    文章详情
    ''''''
    nid =models.AutoField(primary_key=True)
    content = models.TextField()
    article =models.OneToOneField(to =''Article'',to_field=''nid'')

class Article2Tag(models.Model):
    ''''''
    文章和标签的多对多关系表
    ''''''
    nid =models.AutoField(primary_key=True)
    article =models.ForeignKey(to=''Article'',to_field=''nid'')
    tag =models.ForeignKey(to =''Tag'',to_field=''nid'')

    class Meta:
        unique_together = ((''article'',''tag''),)

class ArticleUpDown(models.Model):
    ''''''
    点赞
    ''''''
    nid= models.AutoField(primary_key=True)
    user =models.ForeignKey(to =''UserInfo'',null=True)
    article = models.BooleanField(default=True)

    class  Meta:
        unique_together = ((''article'',''user''),)

class Comment(models.Model):
    ''''''
    评论表
    ''''''
    nid = models.AutoField(primary_key=True)
    article =models.ForeignKey(to =''Article'',to_field=''nid'')
    user =models.ForeignKey(to =''UserInfo'',to_field=''nid'')
    content =models.CharField(max_length=255)#评论内容
    create_time =models.DateTimeField(auto_now_add=True)
    parent_comment =models.ForeignKey(''self'',null=True)

    def __str__(self):
        return self.content

 

 

# 告诉Django项目用哪张表做认证

AUTH_USER_MODEL =''app01.UserInfo''

 

新建一个管理员账号 

admin / dadmin01 

 

 通过 web 去登录 

 

修改显示的内容

 

 

 

 

展示的内容

 

 

 

设置某个字段为连接字段

 

 

 

 

 增加方法字段:

 

 

 

 

 

 

 

 

 

批量初始化 

 

重写页面

 

 

 

 

 

 

Admin 的实现流程

 

1. 启动

   import admin 

 

  def autodiscover():

    autodiscover_modules(''admin'', register_to=site)

 

  执行每个 app 下的 admin.py 文件

  

 

 

 

 

2. 注册 (单例模式 singlelton pattern)

 

 

 

3. 

 

 

 

单例模式 

 

# class Person(object):
#
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#
#
# alex=Person("alex",33)
# egon=Person("egon",32)

  

# 单例模式方式 1 :__new__

# class Singleton(object):
#
#     _instance = None
#     def __new__(cls, *args, **kw):
#         if not cls._instance:
#             cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
#         return cls._instance
#
# class MyClass(Singleton):
#     a = 1
#
#
#
# mc1=MyClass()
#
# mc2=MyClass()
#
# mc3=MyClass()


# print(id(mc1))
# print(id(mc2))
# print(id(mc3))

  

 

# 单例模式方式 2 :模块方式

 

# 思考1
# from mysingleton import my_singleton as my_singleton_new
#
# print(id(my_singleton_new)) 
# print(id(my_singleton))

# 思考2
# import func
#
# func.bar()

# 思考3

from mysingleton import my_singleton,My_Singleton

ms1=My_Singleton()

from mysingleton import my_singleton,My_Singleton

ms2=My_Singleton()

print(id(ms1))
print(id(ms2))

  

 

Django Admin Cookbook-15 如何在 Django Admin 后台模型列表页面中添加自定义操作按钮

Django Admin Cookbook-15 如何在 Django Admin 后台模型列表页面中添加自定义操作按钮

15. 如何在 Django Admin 后台模型列表页面中添加自定义操作按钮?

UMSRA 之前决定,如果有足够的 k 石,所有 Hero 英雄都可以死亡。但是,他们希望能够改变主意,让所有 Hero 英雄都可以永生。

你需要添加两个按钮:一个按钮使所有英雄都可以死亡,而另一个按钮使所有英雄永生。由于它会影响所有英雄,而与选择无关,因此这需要一个单独的按钮,而不是操作下拉菜单。

首先,我们要更改 HeroAdmin 管理模型使用的模板文件,以便我们可以添加两个按钮:

@admin.register(Hero)
class HeroAdmin(admin.ModelAdmin, ExportCsvMixin):
    change_list_template = "entities/heroes_changelist.html"

然后,我们需要覆盖 get_urls 方法,并在管理模型上添加 set_immortal 和 set_mortal 方法。它们将用作两种 view 视图:

def get_urls(self):
    urls = super().get_urls()
    my_urls = [
        path(''immortal/'', self.set_immortal),
        path(''mortal/'', self.set_mortal),
    ]
    return my_urls + urls
def set_immortal(self, request):
    self.model.objects.all().update(is_immortal=True)
    self.message_user(request, "All heroes are now immortal")
    return HttpResponseRedirect("../")
def set_mortal(self, request):
    self.model.objects.all().update(is_immortal=False)
    self.message_user(request, "All heroes are now mortal")
    return HttpResponseRedirect("../")

最后,我们通过扩展 admin/change_list.html 来创建模板文件 entities/heroes_changelist.html:

{% extends ''admin/change_list.html'' %}
{% block object-tools %}
    <div>
        <form action="immortal/" method="POST">
            {% csrf_token %}
                <button type="submit">Make Immortal</button>
        </form>
        <form action="mortal/" method="POST">
            {% csrf_token %}
                <button type="submit">Make Mortal</button>
        </form>
    </div>
    <br />
    {{ block.super }}
{% endblock %}

在点击页面的 make_mortal 动作后,英雄全都可以死亡,你会看到如下消息提示。

返回目录

Django Admin Cookbook-16如何使用Django Admin管理后台导入CSV

Django Admin Cookbook-16如何使用Django Admin管理后台导入CSV

16.如何使用Django Admin管理后台导入CSV?

假设你需要允许在Hero管理页面上导入CSV数据。为此,您需要添加一个指向更改Hero列表页面的链接,点击这个链接会跳转到上传页面。你需要编写一个处理POST请求的方法,来从CSV文件中获取数据对象:

class CsvImportForm(forms.Form):
    csv_file = forms.FileField()
@admin.register(Hero)
class HeroAdmin(admin.ModelAdmin, ExportCsvMixin):
    ...
    change_list_template = "entities/heroes_changelist.html"
    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            ...
            path(''import-csv/'', self.import_csv),
        ]
        return my_urls + urls
    def import_csv(self, request):
        if request.method == "POST":
            csv_file = request.FILES["csv_file"]
            reader = csv.reader(csv_file)
            # Create Hero objects from passed in data
            # ...
            self.message_user(request, "Your csv file has been imported")
            return redirect("..")
        form = CsvImportForm()
        payload = {"form": form}
        return render(
            request, "admin/csv_form.html", payload
        )

然后创建模板文件entities/heroes_changelist.html,以覆盖原有的admin/change_list.html:

{% extends ''admin/change_list.html'' %}
{% block object-tools %}
    <a href="import-csv/">Import CSV</a>
    <br />
    {{ block.super }}
{% endblock %}

最后,创建上传页面csv_form.html:

{% extends ''admin/base.html'' %}
{% block content %}
    <div>
        <form action="." method="POST" enctype="multipart/form-data">
            {{ form.as_p }}
            {% csrf_token %}
                <button type="submit">Upload CSV</button>
        </form>
    </div>
    <br />
{% endblock %}

修改完后,会在更改Hero后台列表页面上会有一个Import CSV的链接.

点击后上传页面显示如下。

返回目录

Django Admin Cookbook-38如何获取特定对象的Django Admin后台URL

Django Admin Cookbook-38如何获取特定对象的Django Admin后台URL

38.如何获取特定对象的Django Admin后台URL?

Hero模型有一个children字段,显示每个英雄的孩子的名字。你被要求将每个childrin链接到Hero模型更改页面。实现如下:

@admin.register(Hero)
class HeroAdmin(admin.ModelAdmin, ExportCsvMixin):
    ...
    def children_display(self, obj):
        display_text = ", ".join([
            "<a href={}>{}</a>".format(
                    reverse(''admin:{}_{}_change''.format(obj._meta.app_label, obj._meta.model_name),
                    args=(child.pk,)),
                child.name)
             for child in obj.children.all()
        ])
        if display_text:
            return mark_safe(display_text)
        return "-"

以上的reverse(''admin:{}_{}_change''.format(obj._meta.app_label, obj._meta.model_name), args=(child.pk,))返回一个对象后台修改页的URL。

其他页面如下:

  • 删除页URL: reverse(''admin:{}_{}_delete''.format(obj._meta.app_label, obj._meta.model_name), args=(child.pk,))
  • 历史页URL: reverse(''admin:{}_{}_history''.format(obj._meta.app_label, obj._meta.model_name), args=(child.pk,))

返回目录

关于django-admin.py dumpdata到SQL语句django导入mysql的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于day 82 Django Admin 组件.、Django Admin Cookbook-15 如何在 Django Admin 后台模型列表页面中添加自定义操作按钮、Django Admin Cookbook-16如何使用Django Admin管理后台导入CSV、Django Admin Cookbook-38如何获取特定对象的Django Admin后台URL等相关知识的信息别忘了在本站进行查找喔。

本文标签: