Dalam model profil saya, saya ingin menyimpan nilai country atau city, country pada bidang lokasi kustom. Juga nilai country harus disediakan. Jadi saya membuat LocationField yang mengimplementasikan multivaluade. Saya tidak lanjut di Django, jadi bagaimana saya bisa membuat country diperlukan? Saya juga tidak yakin kode ini benar-benar benar.

P.S: Saya dapat membuat bidang kota dan negara di profil tetapi memegangnya di satu bidang tampaknya lebih rapi.

Model.py.

from cities_light.models import City, Country

class Profile(models.Model):

    user                = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    first_name          = models.CharField(verbose_name='first name', max_length=10, null=False, blank=False, default='baris') 
    last_name           = models.CharField(verbose_name='last name', max_length=10, null=False, blank=False, default='baris')
    profile_photo       = models.ImageField(verbose_name='profile photo', ) #TODO add upload to
    about               = models.CharField(verbose_name='about', max_length=255, null=True, blank=True)
    spoken_languages    = models.CharField(verbose_name='spoken languages', max_length=255, null=True, blank=True)
    location            = LocationField()


class LocationField(MultiValueField):
    
    def __init__(self, **kwargs):

        fields = (
            Country(),
            City()
        )
        super.__init__(fields=fields, require_all_fields=False, **kwargs)
0
altF4 4 April 2021, 01:00

1 menjawab

Jawaban Terbaik

Mungkin Anda ingin model Location? Anda dapat menambahkan bidang type yang merupakan kota atau negara dan menambahkan bidang unique_together untuk membatasi profil masing-masing satu kota dan negara:

COUNTRY = 0
CITY = 1

class Location(models.Model):

    LOCATION_TYPE_CHOICES = ((COUNTRY, 'country'), (CITY, 'city'))

    profile = models.ForeignKey('Profile', ..., related_name='locations')
    name = models.CharField(...)
    type = models.IntegerField(..., choices=LOCATION_TYPE_CHOICES)

    class Meta:
        unique_together = ('profile', 'type')

Maka Anda dapat mengakses lokasi profil seperti itu:

from . import models

profile = models.Profile.objects.get(id="<pofile-id>")

# either a location instance of type 'country' or None if none exist:
country = profile.locations.filter(type=models.COUNTRY).first()

# either a location instance of type 'city' or None if none exist:
city = profile.locations.filter(type=models.CITY).first()
1
Daniel 4 April 2021, 00:45