Documentation |
Issues |
Changelog |
Funding 💚
Django-VIES
Validate and store VAT Information Exchange System (VIES) data in Django.
Installation
python3 -m pip install django-vies
Usage
VATINField for models
from django.db import models
from vies.models import VATINField
class Company(models.Model):
name = models.CharField(max_length=100)
vat = VATINField(blank=True, null=True)
VATIN wrapper class, allows access to result.
>>> from vies.types import VATIN
>>> vat = VATIN('LU', '26375245')
>>> vat.is_valid()
True
>>> vat.data
{
'countryCode': 'LU',
'vatNumber': '26375245',
'requestDate': datetime.date(2020, 4, 13),
'valid': True,
'name': 'AMAZON EUROPE CORE S.A R.L.',
'address': '38, AVENUE JOHN F. KENNEDY\nL-1855 LUXEMBOURG'
}
You can also use the classmethod VATIN.from_str to create VATIN from
str.
>>> from vies.types import VATIN
>>> vat = VATIN.from_str('LU26375245')
>>> vat.is_valid()
True
The VIES API endpoint can be very unreliable and seems to have an IP
based access limit. Therefore the VATINField does NOT perform API
based validation by default. It needs to be explicitly turned on or
performed in a separate task.
e.g.
from vies.models import VATINField
from vies.validators import VATINValidator
class Company(models.Model):
name = models.CharField(max_length=100)
vat = VATINField(validators=[VATINValidator(verify=True, validate=True)])
validate=True will tell the validator to validate against the VIES
API. verify is enabled on by default and will only verify that the
VATIN matches the country's specifications.
It is recommended to perform VIES API validation inside an asynchronous task.
e.g. using celery
from celery import shared_task
from vies.models import VATINField
from vies.types import VATIN
from django.core.exceptions import ValidationError
class Company(models.Model):
name = models.CharField(max_length=100)
vat = VATINField()
vat_is_valid = models.BooleanField(default=False)
def __init__(self, *args, **kwargs):
super(Company, self).__init__(*args, **kwargs)
self.__vat = self.vat
def save(self, *args, **kwargs):
if self.__vat != self.vat:
validate_vat_field.delay(self.pk)
super(Company, self).save(*args, **kwargs)
self.__vat = self.vat
def refresh_from_db(self, *args, **kwargs):
super(Company, self).refresh_from_db(*args, **kwargs)
self.__vat = self.vat
@shared_task
def validate_vat_field(company_id):
company = Company.objects.get(pk=company_id)
vat = VATIN.from_str(company.vat)
try:
vat.validate()
except ValidationError:
company.vat_is_valid = False
else:
company.vat_is_valid = True
finally:
company.save(update_fields=["vat_is_valid"])
You can also use
celery.current_app.send_task('validate_vat_field', kwargs={"company_id": self.pk})
to call asynchronous task to avoid circular import errors.
Translations
Feel free to contribute translations, it's simple!
cd vies
django-admin makemessages -l $YOUR_COUNTRY_CODE
Just edit the generated PO file. Pull-Requests are welcome!
Metadata
Release files for django-vies 6.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| django_vies-6.4.0.tar.gz | 10.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_vies-6.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.4 kB
Release files / django_vies-6.4.0.tar.gz
| Download URL | django_vies-6.4.0.tar.gz |
|---|---|
| Size | 10.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
16161ac4e6427ec271ce1cc210ec18e068cf7a084b4e3d856c931572ea4b5a62
|
|
BLAKE2b-256 checksum How to use checksums |
cdabb01e27b0ff289a2717eb65c3a2ffe2ebcb0958d2ee8faf4241fcb6b4ad05
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency logRelease files / django_vies-6.4.0-py3-none-any.whl
| Download URL | django_vies-6.4.0-py3-none-any.whl |
|---|---|
| Size | 19.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5d19f289d808af45b3333cd1b7ba618cdecfd426e6a456519ee7eeb76eaa14b4
|
|
BLAKE2b-256 checksum How to use checksums |
41a7e960f5139a99e14732986eb121ef52077d192a0c3f19060de3d2d4bdbd37
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency log