django + tastypie+postgreSQLを使用してWebアプリケーションのバックエンドを実行しています。そして、別の「プロジェクト」で、私の友人がフロントエンドを実装しています。バックエンドAPIを使用してAJAX呼び出しを作成し、HTMLにデータを入力します。わかった。この時点まで、私はそれを行う方法を理解しています。
問題は、RestfulAPI用にさまざまなリソースを作成するときに発生します。私のモデルの一部は次のように定義されています。
# COUNTRY + MANAGER
class CountryManager(models.Manager):
def create(**kwargs):
try:
country = Country.objects.get(short_name=kwargs['short_name'])
except:
country = Country(name=kwargs['name'], short_name=kwargs['short_name'])
country.save()
return country
class Country(models.Model):
short_name = models.CharField(max_length=max_short_len, unique=True)
name = models.CharField(max_length=max_short_len, unique=False)
lat = models.DecimalField(max_digits=11, decimal_places=9, default=0.0)
lon = models.DecimalField(max_digits=12, decimal_places=9, default=0.0)
objects = CountryManager()
# REGION +`MANAGER
class RegionManager(models.Manager):
def create(**kwargs):
try:
region = Region.objects.get(short_name=kwargs['short_name'])
except:
region = Region(name=kwargs['name'], short_name=kwargs['short_name'], country=kwargs['country'])
region.save()
return region
class Region(models.Model):
name = models.CharField(max_length=max_short_len, unique=False, default='NoName')
short_name = models.CharField(max_length=max_short_len, unique=False, default='NoName')
lat = models.DecimalField(max_digits=11, decimal_places=9, default=0.0)
lon = models.DecimalField(max_digits=12, decimal_places=9, default=0.0)
country = models.ForeignKey('Country')
objects = RegionManager()
# CITY + MANAGER
class CityManager(models.Manager):
def create(**kwargs):
try:
city = City.objects.get(short_name=kwargs['short_name'])
city.lat = kwargs['lat']
city.lon = kwargs['lon']
except:
city = City(name=kwargs['name'], short_name=kwargs['short_name'], lat=kwargs['lat'], lon=kwargs['lon'])
city.save()
return city
class City(models.Model):
name = models.CharField(max_length=max_short_len, unique=False)
short_name = models.CharField(max_length=max_short_len, unique=False, default='NoName')
lat = models.DecimalField(max_digits=11, decimal_places=9, default=0.0)
lon = models.DecimalField(max_digits=12, decimal_places=9, default=0.0)
region = models.ForeignKey('Region')
objects = CityManager()
ここで、可能であれば、/ locationリソースを都市、地域、国の混合にマッピングしたいと思いました。たとえば、/ api / location / 1を取得すると、次のようなJSONが取得されます。
{"location":[
{"city":"London",
"region":"London",
"country":"UK"
}]
}
また、/ api / location / 1をPOSTして、JSONを提供する場合、モデルファイルのCityクラスに配置されたメソッドを呼び出します。
def saveLocation(**kwargs):
# countryN, countrySN, regionN='No region', regionSN='No region', cityN, citySN, cityLat, cityLon, locationType
# define args
countryN = kwargs.get('countryN', None)
countrySN = kwargs.get('countrySN', None)
regionN = kwargs.get('regionN', None)
regionSN = kwargs.get('regionSN', None)
cityN = kwargs.get('cityN', None)
citySN = kwargs.get('citySN', None)
cityLat = kwargs.get('cityLat', None)
cityLon = kwargs.get('cityLon', None)
locationType = kwargs.get('locationType', None)
# put nulls in the args
if regionN is None: regionN = 'No region'
if regionSN is None: regionSN = 'No region'
# control over the params
if regionSN is None or countrySN is None or citySN is None: raise Exception('Invalid parameters')
#Save the country
country = Country.objects.create(name=countryN, short_name=countrSN)
countryId = country.pk
#Save the region, if any. Else save it like "no region"
region = Region.objects.create(name=regionN, short_name=regionSN, country = country)
regionId = region.pk
#Save the city
city = City.objects.create(name=cityN, short_name=citysN, lat=cityLat, lon=cityLon, region=regionId)
return city
Tastypieのマニュアル(http://django-tastypie.readthedocs.org/en/latest/cookbook.html)に従いましたが、resource=model環境でのみ機能します。
また、ModelsResourceが行う直接モデルマッピングを回避するために、独自のクラスMyResource(Resource)を実装しようとしました。しかし、私にはそうするためのスキルや知識がありませんでした。
gitリポジトリ、またはresource=modelを使用せずにDjangoでRestfulAPIを実装する方法を学習できるサンプルコードをリクエストしたいと思います。
前もって感謝します。