写一些Django风格代码时被卡住了。如何使这个精确的查询工作?

2024-04-29 12:20:15 发布

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

这是我的模型.py公司名称:

from tastypie.utils.timezone import now
from django.contrib.auth.models import User
from django.db import models
from django.template.defaultfilters import slugify


class Link(models.Model):
    user = models.ForeignKey(User)
    pub_date = models.DateTimeField(default=now)
    title = models.CharField(max_length=200)
    slug = models.SlugField()
    body = models.TextField()


    def __unicode__(self):
        return self.title

    def save(self, *args, **kwargs):
        # For automatic slug generation.
        if not self.slug:
            self.slug = slugify(self.title)[:50]

        return super(Link, self).save(*args, **kwargs)

class OAuthConsumer(models.Model):

    name = models.CharField(max_length=255)
    key = models.CharField(max_length=255)
    secret = models.CharField(max_length=255)
    active = models.BooleanField(default=True)

    class Meta:
        db_table = "api_oauth_consumer"


    def __unicode__(self):
         return u'%s' % (self.name)

现在一切都正常了,我得到的回复是:/api/v1/links/list/?format=json

^{pr2}$

我想做些改变:

  1. 传递用户名并获取属于该用户名的所有链接。在
  2. 我目前正在通过django管理员添加内容和创建新用户,因为在做post时,我总是设法得到一个错误。我想我可能出了问题,所以任何帮助,比如使用我当前的api创建一个新用户的curl一行代码都会很有帮助。在

编辑:

这是我的新产品api.py文件(我决定创建一个新的UserSignUpResource):

# myapp/api.py

from django.contrib.auth.models import User
from tastypie.authorization import Authorization
from tastypie import fields
from tastypie.resources import ModelResource, ALL, ALL_WITH_RELATIONS
from links.models import Link
from tastypie.serializers import Serializer
from tastypie.admin import ApiKeyInline
from tastypie.models import ApiAccess, ApiKey
from django.db import models
from tastypie.authentication import ApiKeyAuthentication
from tastypie.models import create_api_key
class UserResource(ModelResource):

    class Meta:
        queryset = User.objects.all()
        resource_name = 'users'
        excludes = ['email', 'password', 'is_active', 'is_staff', 'is_superuser'] 
        authorization = Authorization()
        allowed_methods = ['post','get']
        fields = ['username']

        def obj_create(self, bundle, request=None, **kwargs):
            try:
                bundle = super(CreateUserResource, self).obj_create(bundle, request, **kwargs)
                bundle.obj.set_password(bundle.data.get('password'))
                bundle.obj.set_username(bundle.data.get('username'))
                bundle.obj.save() 
            except IntegrityError:
                raise BadRequest('That username already exists')
            return bundle

class LinkResource(ModelResource):
    user = fields.ForeignKey(UserResource, 'user')
    authorization = Authorization()
    class Meta:
        queryset = Link.objects.all()
        resource_name = 'links/list'
        excludes = ['id']
        authorization = Authorization()
        include_resource_uri = False
        excludes = ['limit']

    def apply_filters(self,request,applicable_filters):
        base_object_list = super(LinkResource, self).apply_filters(request, applicable_filters)

        query = request.META.get('HTTP_AUHTORIZATION')
        if query:
            qset = (
                Q(api_key=query))
            base_object_list = base_object_list.filter(qset).distinct()

            return base_object_list

class UserSignUpResource(ModelResource):

    class Meta:
        object_class = User
        queryset = User.objects.all()
        allowed_methods = ['post']
        include_resource_uri = False
        resource_name = 'newuser'
        excludes = ['is_active','is_staff','is_superuser']
        authentication = ApiKeyAuthentication()
        authorizaton = Authorization()
        models.signals.post_save.connect(create_api_key, sender=User)

    def obj_create(self,bundle,request=None,**kwargs):
        try:
            bundle = super(UserSignUpResource, self).obj_create(bundle,request,**kwargs)
            bundle.obj.set_password(bundle.data.get('password'))
            bundle.obj.save()
        except IntegrityError:
            raise BadRequest('The username already exists')
        return bundle

    def apply_authorization_limits(self,request,object_list):
        return object_list.filter(id=request.user.id,is_superuser=True)

现在当我这样做的时候:

curl -v -X POST -d '{"username" : "puck", "password" : "123456"}' -H "Authorization: ApiKey superusername:linklist" -H "Content-Type: application/json" http://127.0.0.1:8000/api/v1/newuser

我得到一个404错误:网址不存在。我检查了一遍又一遍,没有发现网址有任何问题。在

编辑: 对我来说,这是一个相当愚蠢的错误。我忘了在中注册UserSignUpResource网址.py. 在


Tags: fromimportselfapiobjreturnismodels