2012-07-01 17 views
5

Tôi đang tạo thuộc tính trên mô hình Django có tên là "địa chỉ". Tôi muốn địa chỉ để bao gồm các kết nối của một số lĩnh vực tôi có trên mô hình của tôi. Vấn đề là không phải tất cả các trường hợp của mô hình này sẽ có giá trị cho tất cả các trường này. Vì vậy, tôi muốn nối chỉ những trường có giá trị.Python/Django Ghép nối chuỗi tùy thuộc vào chuỗi đó tồn tại

Cách tốt nhất/đa chiều nhất để làm điều này là gì?

Dưới đây là các lĩnh vực có liên quan từ mô hình:

house = models.IntegerField('House Number', null=True, blank=True) 
suf = models.CharField('House Number Suffix', max_length=1, null=True, blank=True) 
unit = models.CharField('Address Unit', max_length=7, null=True, blank=True) 
stex = models.IntegerField('Address Extention', null=True, blank=True) 
stdir = models.CharField('Street Direction', max_length=254, null=True, blank=True) 
stnam = models.CharField('Street Name', max_length=30, null=True, blank=True) 
stdes = models.CharField('Street Designation', max_length=3, null=True, blank=True) 
stdessuf = models.CharField('Street Designation Suffix',max_length=1, null=True, blank=True) 

Tôi chỉ có thể làm một cái gì đó như thế này:

def _get_address(self): 
    return "%s %s %s %s %s %s %s %s" % (self.house, self.suf, self.unit, self.stex, self.stdir, self.stname, self.stdes, self.stdessuf) 

nhưng sau đó sẽ có khoảng trống thêm trong kết quả.

Tôi có thể thực hiện một loạt các câu lệnh if và nối trong mỗi câu lệnh, nhưng điều đó có vẻ xấu.

Cách tốt nhất để xử lý tình huống này là gì?

Cảm ơn.

Trả lời

4
parts = (1, 'a', 'b', 2, 'c', 'd', None, 'f') 
# parts = (self.house, self.suf, self.unit, 
#   self.stex, self.stdir, self.stname, 
#   self.stdes, self.stdessuf) 
' '.join(str(part) for part in parts if part is not None) 
# '1 a b 2 c d e f' 

Bạn chỉ cần làm một danh sách comp, và kiểm tra nếu có giá trị không phải là Không, và cũng có thể chuyển đổi chúng thành một chuỗi để họ tham gia đúng bất kể loại.

+0

Cảm ơn sự bổ sung 'không có gì' –

+0

@DouglasMeehan: Chắc chắn rồi. Ngoài ra nếu bạn muốn lưu vào việc tạo danh sách tạm thời mỗi lần bạn gọi phương thức, bạn có thể lưu các trường trong danh sách dưới dạng thuộc tính lớp, vì nó sẽ không thay đổi giữa các phiên bản. – jdi

+0

Điều gì tốt hơn trong tình huống này? tuple hoặc danh sách? –

2

Tôi muốn sử dụng trình tạo để nhận các giá trị không phải là Falsy và sau đó tham gia chúng. Ví dụ:

parts = (self.house, self.suf, self.unit, self.stex, self.stdir, self.stname, self.stdes, self.stdessuf) 
return " ".join(str(s) for s in parts if s is not None) 
+0

Bạn cần chọn Không có và không phải là giá trị Falsey. Không có gì giống với 0 là số hợp lệ – jdi

+0

vì vậy trong trường hợp đó, tôi có thể làm phần = (self.house, self.suf, self.unit, self.stex, self.stdir, self.stname, self .stdes, self.stdessuf) return "" .join (str (s) cho s trong các phần nếu s không phải là None)? –

+0

@jdi cảm ơn vì đã chỉ ra điều đó! – cberner

1
" ".join(filter(None, 
       [self.house, self.suf, self.unit, 
       self.stex, self.stdir, self.stname, 
       self.stdes, self.stdessuf])) 
+0

Điều này vi phạm nếu trường không phải là một chuỗi. – jdi

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