Django 2 crud操作,不带外部api的数据库

2024-04-18 14:45:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个外部第三方API客户机,用于检索和存储歌曲名称,我需要它与Django 2接口,并允许用户通过Django表单插入和更新歌曲,而无需使用任何数据库后端,而仅使用API。在

我正在挣扎,因为大多数关于Django的文档都假设有数据库后端,甚至关于使用外部API的示例都假设我希望将从restapi获取的数据存储到数据库中。在

外部API甚至不是REST,我只是有一个客户端.py模块与所有的方法,我需要做一个存储歌曲信息的远程服务CRUD操作。在

我曾考虑过创建django2自定义模型管理器,但它似乎是作为现有数据库之上的东西而不是外部API来使用的。 django2序列化程序允许序列化和反序列化API和数据库之间的数据。在

我缺少的是创建一个自定义模型的方法,它抽象了API并允许我像使用数据库一样使用它,这样在抽象了模型层之后,我可以继续学习任何Django表单教程。在

注意:类似的问题被问到here,答案是:“Django是一个以数据库为中心的后端框架,跳过Django并使用Angular”这对Django来说有那么难吗?在

目前,我破解了类似以下SSCE示例的代码:

在网址.py公司名称:

urlpatterns = [
    url(r'^$', viewSong, name='home'),
    url(r'^create/$', SongCreate.as_view(), name='create'),
    url(r'^update/(?P<song_id>[0-9\.a-z]+)/$', SongUpdate.as_view(), name='update'),
]

模板/表单.html公司名称:

^{pr2}$

在视图.py公司名称:

class SongCreate(CreateView):
    template_name = 'form.html'

    def get(self, request, *args, **kwargs):
        form = SongForm()
        return render(request, self.template_name, {'form': form})

    def post(self, request):
        form = SongForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect("/")
        return render(request, self.template_name, {'form': form})


class SongUpdate(UpdateView):
    template_name = 'form.html'

    def get(self, request, *args, **kwargs):
        song_id = kwargs["song_id"]
        obj = SongModel.load(song_id)
        form = SongForm(obj)
        return render(request, self.template_name, {'form': form})

在表单.py公司名称:

class SongForm(forms.Form):
    song_id = forms.CharField(label='song_id', max_length=30)
    song_name = forms.CharField(label='song_name', max_length=100)

    def save(self):
        data = self.cleaned_data
        songModel = SongModel(song_id=data['song_id'],
                              song_name=data['song_name'])
        songModel.save()

在模型.py公司名称:

from django.db import models
from woozy.song_client import SongClient

username = 'woozyuser'
password = 'userpass'
base_url = 'http://localhost:8080'

class SongModel(models.Model):
    song_id = models.CharField(max_length=80)
    song_name = models.CharField(max_length=80)

    def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
        songClient = SongClient()
        songClient.connect(base_url, username, password)
        songClient.create_song(self.song_id,
                               self.song_name)
        return

    @classmethod
    def load(cls, song_id):
        song_model = cls(song_id=song_id)
        songClient = SongClient()
        songClient.connect(base_url, username, password)
        song = songClient.get_song(song_id)
        return song

上面的内容对我来说有点复杂,所以我想我没有尊重Django支持的各种层和架构。在


Tags: djangonamepyselfformapiid数据库