我有一个用于检索和存储歌曲名称的外部第三方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示例:
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'),
]
<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>
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})
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()
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支持的各种层和架构。