django 2 crud操作没有数据库与外部api

时间:2018-02-14 10:06:48

标签: python django rest api django-models

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

我很挣扎,因为关于Django的大多数文档假定数据库后端,甚至使用外部API的示例都假设我想将从REST API中提取的数据存储到数据库。

外部API甚至不是REST ,我只需要一个client.py模块,其中包含我需要在存储歌曲信息的远程服务上进行CRUD操作的所有方法。

我研究了创建一个Django 2自定义模型管理器,但它似乎被用作现有数据库之上的东西而不是外部API。 Django 2序列化程序允许在API和数据库之间序列化和反序列化数据。

我缺少的是创建自定义模型的方法,该模型抽象API并允许我使用它,就好像它是一个数据库一样,以便我可以在抽象模型后继续并遵循任何Django表单教程层

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

目前我攻击了下面的SSCE示例:

urls.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'),
]

templates / form.html:

<form role="form" action="/create/" method="post">
                {% csrf_token %}
                <div class="form-group">
                    <label for="song-id">Song Id</label>
                    <input type="text" id="song-id" name="song-id">
                </div>
                <div class="form-group">
                    <label for="song-name">Song Name</label>
                    <input type="text" id="song-name" name="song-name">
                </div>
</form>

views.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})

forms.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()

models.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支持的各种层和架构。

0 个答案:

没有答案