IPField Design
Mine does not support Python 2 tho... :thinking:  Because the `ipaddress` is a Python 3.x-only module, I'm going to pass on any related modifications to the peewee `IPField`. I think it's perfectly fine for this functionality to continue existing in a third-party library like yours (until such time as Peewee drops python 2 support, which I don't have plans for but will probably happen at some point).

Thanks for sharing this with me, I wasn't aware of the `ipaddress` module and it looks very nice.
Hello, about the Design of new Peewee `IPField`, I am the creator of a package `peewee-extra-fields`,
we have a similar Field for IP, I think we can tinker and collaborate for better on that field:

We have `IPAddressField` and  `IPNetworkField` its features are:

- They use Native Pythons `ipaddress.IPv4Address` and `ipaddress.IPv4Network`
- They use IPv4 and IPv6 transparently.
- The can do checking whether or not two hosts are on the same subnet, iterating over all hosts in a particular subnet, checking whether or not a string represents a valid IP address or network definition, etc etc.

**Compare:**

Peewee:

```python
class IPField(BigIntegerField):
    def db_value(self, val):
        if val is not None:
            return struct.unpack('!I', socket.inet_aton(val))[0]

    def python_value(self, val):
        if val is not None:
            return socket.inet_ntoa(struct.pack('!I', val))
```

peewee-extra-fields:

```python
class IPAddressField(BigIntegerField):
    def db_value(self, value: str) -> int:
        if value and isinstance(value, (str, int)):
            try:
                ip_address(value)
            except Exception as error:
                raise ValueError(f"""{self.__class__.__name__} IP Value is
                not a Valid IP v4 or v6 Address: {value} --> {error}.""")
            else:
                return int(ip_address(value))  # Valid IPv4Address/IPv6Address.
        return value                           # is None.

    def python_value(self, value: str) -> IPv4Address:
        return ip_address(value) if value else value
```

My implementation is transparently Compatible with IPv6:

```python
>>> struct.unpack('!I', socket.inet_aton("fe80::12c3:7bff:fe92:9d4c"))[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: illegal IP address string passed to inet_aton
illegal IP address string passed to inet_aton

>>> int(ip_address("fe80::12c3:7bff:fe92:9d4c"))
338288524927261089655370957493906873676

>>> socket.inet_ntoa(struct.pack('!I', 338288524927261089655370957493906873676))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: argument out of range
argument out of range

>>> str(ip_address("fe80::12c3:7bff:fe92:9d4c"))
'fe80::12c3:7bff:fe92:9d4c'
```

If you like it feel free to steal the code for Peewee itself, no problem.
If you dont like it feel free to Close this Issue, no problem.
:smile_cat: 