2009-06-02 36 views
11

Tôi đang viết một ứng dụng Django thực hiện các chức năng khác nhau, bao gồm chèn hoặc cập nhật các bản ghi mới vào cơ sở dữ liệu thông qua URL.Làm cách nào để cập nhật thành viên của đối tượng bằng cách sử dụng dict?

Vì vậy, một số ứng dụng nội bộ sẽ gửi yêu cầu tới /import/?a=1&b=2&c=3, chẳng hạn. Trong giao diện, tôi muốn tạo một đối tượng mới, foo = Foo() và để các thành viên của foo được đặt thành dữ liệu trong từ điển request.GET.

Đây là những gì tôi đang làm bây giờ:

  1. Yêu cầu gửi đến /import/?a=1&b=2&c=3
  2. Xem tạo ra đối tượng mới: foo = Foo()
  3. Object được cập nhật với dữ liệu.

Dưới đây là những gì tôi đã vậy, đến nay:

foo.a = request['a'] 
foo.b = request['b'] 
foo.c = request['c'] 

Rõ ràng đây là tẻ nhạt và dễ bị lỗi. Dữ liệu trong URL có cùng tên chính xác với các thành viên của đối tượng, vì vậy nó là một ánh xạ 1-tới-1 đơn giản.

Lý tưởng nhất, tôi muốn làm có thể làm một cái gì đó như thế này:

foo = Foo() 
foo.update(request.GET) 

hoặc một cái gì đó về việc đó.

Cảm ơn! thuộc tính

+1

Các giải pháp được trình bày bởi Ants làm những gì bạn muốn nhưng làm thế nào bạn xử lý xác nhận và loại chuyển đổi? Hoặc không phải là mối quan tâm (tôi thấy điều này khó tin). –

+0

Họ không quan tâm. Điều này đang được sử dụng hoàn toàn trong nhà, nơi dữ liệu được chèn vào một cơ sở dữ liệu (có xác thực) và sau đó (ở đây) được chèn vào một cơ sở dữ liệu khác. –

Trả lời

19

Bạn có thể sử dụng chức năng setattr để thiết lập tự động:

for key,value in request.GET.items(): 
    setattr(foo, key, value) 
+0

Cảm ơn. Tôi phải có một rắm não vì tôi đã xem qua các tài liệu được xây dựng trong các chức năng. –

+0

Bạn có thể trao đổi 'a_dict' bằng' request' và 'obj' bằng' foo' để khớp với mã của Nick. –

+0

Tôi cập nhật nó nếu điều đó là tốt với kiến. Cảm ơn một lần nữa! –

1

Bạn đã gần như đã nhận nó.

foo = Foo(**request.GET) 

nên thực hiện thủ thuật.

+0

Tôi nhận được lỗi: __init __() từ khóa phải là chuỗi –

+1

Từ khóa có thể đến thông qua như unicode gây ra lỗi đó. một cái gì đó để tìm kiếm ... Mã này làm việc cho tôi với ba cách khác nhau của writting __init __() – JCotton

+2

Điều đó không giải quyết trường hợp sử dụng cập nhật một mô hình hiện tại với một dict của các giá trị mới. –

1

Nếu bạn đang sử dụng điều này để tạo một đối tượng mô hình sau đó được duy trì, tôi khuyên bạn nên sử dụng ModelForm. Điều này sẽ làm những gì bạn mô tả, theo cách kinh điển cho Django, với việc bổ sung xác nhận.

Để mở rộng - Tôi không có ý định sử dụng nó cho đầu ra biểu mẫu, chỉ cần nhập biểu mẫu. Như sau:

class Foo(models.Model): 
     a = models.CharField(max_length=255), 
     b = models.PositiveIntegerField() 

class FooForm(forms.ModelForm): 
     class Meta: 
      model = Foo 

def insert_foo(request): 
     form = FooForm(request.GET) 
     if not form.is_valid(): 
      # Handle error conditions here 
      pass 
     else: 
      form.save() 

     return HttpResponse('Your response') 

Sau đó, giả sử đó là ràng buộc để// nhập khẩu, một GET/nhập khẩu/A = Kiểm tra & b = 1 sẽ chèn một Foo mới với a = "Test" và b = "1? ".

+0

Tôi không muốn một biểu mẫu hoặc bất kỳ tương tác người dùng nào. Kịch bản gửi dữ liệu được chạy trên một công việc cron qua đêm để cập nhật cơ sở dữ liệu mà Django sử dụng cho những thứ khác. –

3

Nếu request.GET là một cuốn từ điển và class Foo không sử dụng __slots__, thì đây cũng nên làm việc:

# foo is a Foo instance 
foo.__dict__.update(request.GET) 
+0

Không còn hoạt động ở Django 1.3+ –

+0

Điều này hoạt động ở Django 1.6 với một đối tượng chính tả thực sự. Tôi đã không thử request.GET hoặc .POST. – James

Các vấn đề liên quan