Làm cách nào để lấy ID của một bản ghi vừa tạo trong Django?


82

Tôi đang sử dụng Django 1.3 cho một trong các dự án của mình và tôi cần lấy ID của bản ghi vừa được lưu trong cơ sở dữ liệu.

Tôi có một cái gì đó giống như mã bên dưới để lưu bản ghi trong cơ sở dữ liệu:

n = MyData.objects.create(record_title=title, record_content=content)
n.save()

ID của bản ghi vừa được lưu tự động gia tăng. Có cách nào để lấy ID đó và sử dụng nó ở nơi khác trong mã của tôi không?


13
Dòng n.save()này là không cần thiết ở đây, vì MyData.objects.createsẽ tự động lưu phiên bản mới.
Daniel Roseman

Câu trả lời của tôi stackoverflow.com/a/25807622/3762142 sẽ giúp bạn có id trong trang html ..
Raja Simon

Câu trả lời:


118

Sử dụng n.idsau khi lưu.

Xem " Tự động tăng khóa chính ".


2
Khi tôi lưu dữ liệu bằng cách sử dụng biểu mẫu trong dạng xem thì làm thế nào để truy cập id chỉ được lưu bởi đối tượng froms?
Neeraj Kumar

2
Điều này nên xảy ra n.pkvì nó sẽ chỉ là id nếu bạn không tự thêm khóa chính hoặc thêm khóa và đặt tên là id.
Joel G Mathew

@JamesO làm thế nào để lấy hoặc giải quyết id này như một trường hợp mô hình.
Jeet Patel

54

Nó sẽ là n.pk.

Để trích dẫn " Model.pk ":

Bất kể bạn tự xác định trường khóa chính hay để Django cung cấp một trường khóa chính cho bạn, mỗi mô hình sẽ có một thuộc tính gọi là pk. Nó hoạt động giống như một thuộc tính bình thường trên mô hình, nhưng thực sự là một bí danh cho bất kỳ thuộc tính nào là trường khóa chính của mô hình. Bạn có thể đọc và đặt giá trị này, giống như cách bạn làm đối với bất kỳ thuộc tính nào khác và nó sẽ cập nhật trường chính xác trong mô hình.


4
tìm thấy tốt. Điều này cho thấy rằng gọi .pkcó thể được coi là "phương pháp hay nhất" vì nó tham chiếu đến id mặc định hoặc id tùy chỉnh.
j_syk

liên kết trên chuyển đến phiên bản in-dev của django. v 1,7 v1.10 nói điều tương tự, mặc dù: docs.djangoproject.com/en/1.10/ref/models/instances/... không chắc chắn về trước v1.7
Keith


1

Xóa save () và nhận pk trực tiếp:

n = MyData.objects.create(record_title=title, record_content=content)
n.pk

1

Tôi đã gặp sự cố tương tự với việc truy cập id. Trong Django 3.0.5, đây là cách tôi truy cập id. Sử dụng ví dụ và tên biến của bạn, hãy xem bên dưới:

instance = n.save()
# return the id
instance[0].id 

Biến 'instance' ở trên là một danh sách. Truy cập id trong các phương pháp được mô tả ở trên trả về lỗi AttributeError ("đối tượng không có thuộc tính 'id'") trong Django 3.

Câu trả lời này áp dụng khi sử dụng modelformset_factory. Điều này đúng khi tạo lớp Biểu mẫu từ mô hình Django như được mô tả trong tài liệu Django


0

Nếu ai đó đọc câu hỏi này, phần còn lại của câu trả lời bạn vẫn gặp sự cố khi truy cập id sau khi tạo đối tượng. Đảm bảo rằng bạn không xác định idlà Số nguyên trong mô hình của mình. Nó miễn phí trong Django nên bạn không thể viết id hoặc sử dụngAutofield

#No
class TestModel(models.Model):
    id = models.IntegerField(primary_key=True)
    something...


#Ok
class TestModel(models.Model):
    id = models.AutoField(primary_key=True)
    something...

#Ok
class TestModel(models.Model):
    something...

nếu bạn xác định idlà Số nguyên, TestModel.objects.create(hoặc với save()sẽ trả về Không có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.