1

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を実装する方法を学習できるサンプルコードをリクエストしたいと思います。

前もって感謝します。

4

1 に答える 1

0

Location モデルを作成するか、City モデルをベースとして使用する必要があると思います。考えてみてください、「本当の」場所は都市であり、地域と国は継承されます。

これに対する私の推奨事項は、単純なリソース (モデル リソースではない) を作成し、必要なメソッドを実装することです。

それはあなたが必要とするすべてをカバーするはずです。ModelResourceこれらのメソッドがどのように実装されているかを確認するには、 を参照してください。

于 2012-09-21T13:24:33.800 に答える