我有一个ModelViewSetDjango的REST框架,它让我能够通过以下地址进行POST和GET:
api/v1/users
这些用户与评论表有反向关系,我希望能够通过URL访问这些评论:
api/v1/users/<username>/comments
我能够@detail_route通过覆盖queryset和设置自定义来实现这一点,serializer_class但它只适用于GET请求.如果我尝试通过REST Framework的管理部分发布新评论,我会收到一条错误通知,指出"'ListSerializer'对象不可迭代"
这是我的代码:
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserFlat
lookup_field = 'username'
@detail_route(methods=['post','get'])
def comment(self, request, **kwargs):
user = self.get_object()
self.queryset = Comment.objects.filter(recipient=user.id)
self.serializer_class = CommentFlat
serializer = CommentFlat(instance=self.queryset, many=True)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
新评论应采用以下参数:
comment.author,comment.message,comment.recipient
我可以在管理面板中输入所有这些字段并尝试创建一个帖子请求,但它失败了.理想情况下,我只需要填写comment.message和comment.author,并且comment.recipient字段应该使用在网址中获取的user.id自动填充.api/v1/users/<username>/comments
有谁知道为什么我的帖子请求没有完成以及如何自动填充该字段?
我一直试图改变Django REST Framework管理面板的表单字段的价值,并且出于某种原因,改变永远不会发生.我有下面的序列化器
class SomeView(ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
# I Want to override this and change the POST data
def perform_create(self, serializer):
user = self.request.user.id
# this was a form field where I manually entered the user ID
# I now want it to default to the logged in user
serializer.data['user'] = user
# This returns the original user that was entered into the form field
print serializer.data
Run Code Online (Sandbox Code Playgroud)
我检查了serializer.data,dir()它只是一个python字典,所以我无法弄清楚为什么我无法修改该值.作为测试,我尝试添加额外的值,但这也不起作用
# this doesnt work
serializer.data['some_new_field'] = …Run Code Online (Sandbox Code Playgroud) 我在Elastic Beanstalk上设置了我的Django应用程序,并且最近对我希望现在应用于实时数据库的数据库进行了更改.我知道我需要将其设置为容器命令,并且在检查数据库后我可以看到迁移已经运行,但我无法弄清楚如何对迁移进行更多控制.例如,我只希望在必要时运行迁移,但根据我的理解,容器将在每个部署上运行迁移,假设命令仍在配置文件中列出.此外,在某些情况下,我将在迁移期间获得选项,例如:
Any objects realted to these content types by a foreign key will also be deleted.
Are you sure you want to delete these content types?
If you're unsure, answer 'no'
Run Code Online (Sandbox Code Playgroud)
如何yes在部署阶段设置容器命令以响应此操作?
这是我当前的配置文件
container_commands:
01_migrate:
command: 'source /opt/python/run/venv/bin/actiate && python app/manage.py makemigrations'
command: 'source /opt/python/run/venv/bin/activate && python app/manage.py migrate'
Run Code Online (Sandbox Code Playgroud)
有没有办法将这两个命令设置为仅在必要时运行并响应我在迁移期间收到的是/否选项?
我有这个奇怪的问题,svg在safari中悬停时调整大小.我正在使用jquery的悬停来替换svg略有不同的页面上的svg.这项工作适用于所有浏览器,除了safari,由于某种原因完全调整svg在鼠标悬停和mouseout上的大小.
我的svg的高度设置在css中
img.svg-graphic {
height: 180px;
}
Run Code Online (Sandbox Code Playgroud)
并在页面上显示为图像
<div class="container">
<img class="svg-graphic" src="svg-icons/version1.svg">
</div>
Run Code Online (Sandbox Code Playgroud)
当我将鼠标悬停在容器上时,我将svg替换为另一个,然后当我将鼠标悬停时返回默认值.
$('.container').hover(function() {
$('.svg-graphic').attr('src', 'svg-icons/version2.svg');
}, function() {
$('.svg-graphic').attr('src', 'svg-icons/version1.svg');
});
Run Code Online (Sandbox Code Playgroud)
什么可能导致safari完全忽略尺寸的想法?
我来自PHP背景,我一直在努力学习Python,但是我在调试方面遇到了很多麻烦,因为我还不确定如何在Django或Python中解决这个问题.
我习惯于能够print_r或var_dumpPHP中的所有东西.我可以在控制器,服务层或甚至模型和数据中显示在我的Web浏览器中.
我不能在Django中这样做.根据我正在做的事情,尝试print从我的视图中执行一个对象将导致页面关闭或输出一些东西到我的控制台,这对我没有帮助.这是一个例子:
class Page(View):
def get(self, request, *args, **kwargs):
response = Data.objects.all()
# for whatever reason, I want to print something right now:
print response
# return JsonResponse({'success':response})
Run Code Online (Sandbox Code Playgroud)
以上内容将完全取消我的页面并发出通知说:
The view didn't return an HttpResponse object. It returned None instead.
Run Code Online (Sandbox Code Playgroud)
在使用CBV的时候有一些情况,我注意到我可以将数据转移到某个地方,例如控制台.但它不会对我有任何帮助.例如,如果我试图查看response上面的内容,它就会显示如下:
[object Object] [object Object] [object Object]
Run Code Online (Sandbox Code Playgroud)
A var_dump会让我真正看到它的内部.
所以我猜我错了.人们只是在用Python调试时转储数据吗?如果他们这样做,你如何执行此操作,并将其显示在Web浏览器或控制台中?如果没有,我如何处理Django中的基本故障排除?示例场景:
我有两个相关的模型(事件+位置),其串行器如下所示:
class Locations
title = models.CharField(max_length=250)
address = model.CharField(max_length=250)
class Events
title = models.CharField(max_length=250)
locations = models.ForeignKey(Locations, related_name='events'
class EventsSerializer(serializers.ModelSerializer):
class Meta:
model = Events
depth = 1
Run Code Online (Sandbox Code Playgroud)
我在序列化器中将depth设置为1,这样我就可以从Locations模型而不是单个模型中获取信息id。但是,在执行此操作时,我无法发布具有位置信息的事件。我只能执行带有title属性的帖子。如果删除序列化程序中的depth选项,则可以同时显示标题和位置ID。
我试图创建没有深度字段的第二个序列化器(EventsSerialzerB),目的是将第一个序列化器用作只读响应,但是当我创建第二个序列化器,视图集并将其添加到路由器时,它将自动覆盖原始视图集。
我可以创建一个输出相关模型字段的序列化程序,并允许您直接发布到单个模型吗?
//编辑-这是我要发布的内容
$scope.doClick = function (event) {
var test_data = {
title: 'Event Test',
content: 'Some test content here',
location: 2,
date: '2014-12-16T11:00:00Z'
}
// $resource.save() doesn't work?
$http.post('/api/events/', test_data).
success(function(data, status, headers, config) {
console.log('sucess', status);
}).
error(function(data, status, headers, config) {
console.log('error', status);
}); …Run Code Online (Sandbox Code Playgroud) 我是python的初学者,__init__.py即使在搜索了几个教程后,我也很难设置应用程序的结构.
目前,我当前的目录结构如下所示
/parent
/myapp
__init__.py
views.py
/virtualenv
Run Code Online (Sandbox Code Playgroud)
以前,我有(如果它有任何区别)
/parent
/myapp
/bin
/include
/lib
Run Code Online (Sandbox Code Playgroud)
内容__init__.py如下:
from flask import Flask
app = Flask(__name__)
Run Code Online (Sandbox Code Playgroud)
和我的views.py
from myapp import app
@app.route('/')
def test():
return 'This is a new test'
if __name__ == '__main__':
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)
如果myapp正在使用init文件初始化,为什么我不能将它调用到视图中?我收到一条错误,指出"我无法导入应用程序,而且我没有名为myapp的模块".如果我删除init文件并将内容复制到views.py文件的顶部,一切正常.
我正在用 Go 编写一个 webhook 来解析 JSON 有效负载。我正在尝试记录原始有效负载,然后立即对其进行解码,但是当我尝试时它失败了。如果我分别执行这些操作,它们都可以独立正常工作。
有人可以解释为什么我不能使用ioutil.ReadAll和json.NewDecoder在一起?
func webhook(w http.ResponseWriter, r *http.Request) {
body, _ := ioutil.ReadAll(r.Body)
log.Printf("incoming message - %s", body)
var p payload
decoder := json.NewDecoder(r.Body)
err := decoder.Decode(&p)
if err != nil {
// Returns EOF
log.Printf("invalid payload - %s", err)
}
defer r.Body.Close()
}
Run Code Online (Sandbox Code Playgroud) 我无法理解Go 中的*和&符号。我理解指针接收器允许我们修改接收器指向的值的概念:
type Vertex struct {
X, Y float64
}
// This adjust the value of v.X and v.Y
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
Run Code Online (Sandbox Code Playgroud)
但我也看到了返回指针接收器的函数,例如 net/http 库。
func NewRequest(method, url string, body io.Reader) (*Request, error)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,为什么Request返回的人面前会有一颗星星?
另外,我经常看到&在分配变量时使用
import net/http
client := &http.Client{}
Run Code Online (Sandbox Code Playgroud)
为什么不只是client := http.Client{}?